慢系統調用的中斷與重啓

所謂慢系統調用("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 */
        }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章