當程序在執行處於阻塞狀態的系統調用時接收到信號,並且我們爲該信號設置了信號處理函數,在信號處理函數返回後,程序將面臨繼續執行或不執行慢速系統調用兩種選擇,默認情況下是系統調用將被中斷,並且errno被設置爲EINTR。我們可以選擇繼續執行,有以下兩種方法:
1.在設置信號處理函數的時候,爲信號設置SA_RESTART標誌以自動重啓被該信號中斷的系統調用,但是該方法對某些慢速系統調用無效,比如epoll_wait,poll,seletc等慢速系統調用,即使給信號設置了該選項,也會被中斷。具體對那些慢速系統調用無效可查看manpages。
2.手動重啓,對慢速系統調用的返回值進行判斷,若errno==EINTR,則重新調用慢速系統調用
綜上所述,若想要重啓系統調用,最好使用方法2。