1. 程式人生 > 其它 >慢速系統呼叫會被捕獲訊號中斷

慢速系統呼叫會被捕獲訊號中斷

一、慢速系統呼叫可能造成程序永久阻塞

  慢速系統呼叫包括:

  1、在讀某些型別的檔案(管道、終端裝置以及網路裝置)時,如果資料不存在,則呼叫者永遠阻塞。
    說明:
    管道:如果建立了一對讀寫管道,如果寫管道始終沒有寫資料,而讀管道程序就會被阻塞。
    終端裝置:如果要從終端read,但卻沒有輸入,那麼阻塞
    網路裝置:如果要讀資料,對端未準備好資料,則阻塞
  2、在寫這些型別的檔案,如果不能立即接受這些資料,則呼叫者會阻塞
  3、開啟某些型別的檔案,在某種條件發生之前也可能會使呼叫者阻塞(如採用MODEM遠端登陸的情況)
  4、pause和wait函式
  5、某些ioctl函式
  6、某些程序間通訊函式

  

二、慢速系統呼叫會被捕捉到的訊號中斷

  當程序設定了某個訊號的處理函式時意味著需要處理這個函式,此時就會中斷阻塞的程式去進行處理函式。

  ioctal、read、readv、write和writev只對低速裝置進行操作時會被訊號中斷。

  wait和waitpid在捕捉到訊號時總是被中斷,中斷時產生EINTR錯誤,所以多執行緒中使用wait和waitpid等待多個子執行緒時可能需要判斷EINTR錯誤。例如SIGCHLD,系統自動處理此訊號,所以不設定重啟動。

while(waitpid(pid,&stat,0)<0)
    if(errno!=EINTR)
        
return -1;

  同時Linux支援被中斷的系統呼叫的自動重啟動,在sigaction的struct sigaction裡的sa_flags欄位中設定SA_RESTART可以使被中斷的系統呼叫自動重啟。而使用signal設定訊號處理函式時,是否重啟動則根據不同系統的具體實現。所以儘量使用sigaction設定處理函式。