EINTR

當程序在執行處於阻塞狀態的系統調用時接收到信號,並且我們爲該信號設置了信號處理函數,在信號處理函數返回後,程序將面臨繼續執行或不執行慢速系統調用兩種選擇,默認情況下是系統調用將被中斷,並且errno被設置爲EINTR。我們可以選擇繼續執行,有以下兩種方法:

1.在設置信號處理函數的時候,爲信號設置SA_RESTART標誌以自動重啓被該信號中斷的系統調用,但是該方法對某些慢速系統調用無效,比如epoll_wait,poll,seletc等慢速系統調用,即使給信號設置了該選項,也會被中斷。具體對那些慢速系統調用無效可查看manpages。

2.手動重啓,對慢速系統調用的返回值進行判斷,若errno==EINTR,則重新調用慢速系統調用

綜上所述,若想要重啓系統調用,最好使用方法2。

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