所謂慢系統調用("slow" system calls),是指在調用過程中可能會永久阻塞的調用。比如,讀寫管道、終端或網絡設備時的read、write。
慢系統調用可能會被信號中斷,通常這個情況下,該調用會返回錯誤,並設置errno爲EINTR(有些系統的實現不返回錯誤,返回中斷前已經讀寫的那一部分數據的字節數)。儘管如此,現在很多系統提供了慢系統調用的自動重啓機制,比如,在使用sigaction時指定SA_RESTART標誌,就可以讓被中斷的系統調用自動重啓。
雖然有這個重啓機制,但並不是所有的系統都支持,所以,考慮到可移植性,通常慢系統調用的代碼寫成下面的樣子:
again:
if ((n = read(fd, buf, BUFFSIZE)) < 0) {
if (errno == EINTR)
goto again; /* just an interrupted system call */
/* handle other errors */
}