中斷系統調用
系統調用可分為兩類:慢速系統調用和其他系統調用。
- 慢速系統調用:可能會使進程永遠阻塞的一類。如果在阻塞期間收到一個信號,該系統調用就被中斷,不再繼續執行(早期);也可以設定系統調用是否重啟。如,read、write、pause、wait...
- 其他系統調用:getpid、getppid、fork...
結合pause,回顧慢速系統調用:
慢速系統調用被中斷的相關行為,實際上就是pause的行為: 如,read
① 想中斷pause,信號不能被屏蔽。
② 信號的處理方式必須是捕捉 (默認、忽略都不可以)
③ 中斷后返回-1, 設置errno為EINTR(表“被信號中斷”)
可修改sa_flags參數來設置被信號中斷后系統調用是否重啟。SA_INTERRURT不重啟。 SA_RESTART重啟。
擴展了解:
sa_flags還有很多可選參數,適用于不同情況。如:捕捉到信號后,在執行捕捉函數期間,不希望自動阻塞該信號,可將sa_flags設置為SA_NODEFER,除非sa_mask中包含該信號。