2011-11-08 24 views
16

這是對Is a successful send() "atomic"?的後續問題,因爲我認爲它實際上涉及系統調用,而不僅僅是發送套接字。何時以及如何中斷系統調用?

哪些系統調用可以中斷,何時中斷,中斷在哪裏處理?我已經瞭解了SA_RESTART,但並不完全理解正在發生的事情。

  • 如果我做一個系統調用,而不SA_RESTART,可以在呼叫被任何中斷的中斷(例如,用戶輸入)不關心我的應用程序,但需要OS中止我的電話,做一些事情其他?或者它只是被直接關係到我的進程的信號中斷(CTRL + C,socket關閉,...)?

  • 設置SA_RESTART時,send()或其他任何「慢速」系統調用的語義是什麼?它會一直阻塞,直到我的所有數據傳輸或套接字關閉,還是可以返回一個小於send()參數中的計數的數字?

  • 在哪裏重新啓動實施?操作系統是否知道我希望在發生任何中斷時重新啓動呼叫,還是將某些信號發送到我的流程,然後通過庫代碼處理?或者我必須自己做,例如在一個while循環中包裝呼叫並按需要重試?

回答

9

系統調用可通過任何signal被打斷,這包括這樣的信號作爲信號情報(通過CTRL-C生成的),SIGHUP等

SA_RESTART被設置,一個send()將返回(與發送計數)如果在收到信號之前發送了任何數據,如果發送超時已設置(因爲這些無法重新啓動),將返回錯誤EINTR,否則將重新啓動send()

系統調用重啓在內核的信號處理代碼中實現。系統調用在檢測到待處理信號(或等待信號中斷)後內部返回-ERESTARTSYS,這會導致信號處理代碼將指令指針和相關寄存器恢復到調用之前的狀態,從而使系統調用重複。

+1

這隻意味着信號發送到我的過程,對不對?我以某種方式假定任何處理我的中斷的內核中斷(按鍵,鼠標移動,定時器中斷...)都會導致我的調用返回併發送信號。 系統調用期間的上下文切換不應以除時間之外的任何方式干擾我的進程,對吧? – lxgr

+1

@lxgr,這是正確的,上下文切換不會中止系統調用。 –