Linux下C編程:訊號處理潛在危險

來源:互聯網
上載者:User

訊號作為非同步進程的通訊方式,在實際應用中是方便而實用的。但是,也應該注意到在使用訊號時的潛在危險。在此簡單介紹幾種可能引發錯誤的具體情況,希望在實際進行訊號處理時特別注意。

當註冊了一個訊號處理函數時,可能會對某些系統調用進行修改。通常來講,它們本來應是不受訊號的影響,但由於註冊了一個訊號處理函數,系統可能會認為在一個訊號到來時需要中斷原系統調用。當這種情況發生時,原系統調用被終止,返回調用失敗值,同時errno將被設定為EINTR。當然有一些時候,確實希望系統如此處理,但在另一些情況下,並不希望這樣,因為有可能由於返回的錯誤碼使其後的進程無法按所希望的方向進行,甚至可能由於在後續的運行中未對出錯返回作出相應處理而認為調用成功,從而導致資料的丟失。因此,建議使用函數sigaction 設定SA_RESTART 標誌來防止這一情況的發生。

另一種情況是,在執行使用者自行設定的訊號處理函數時,也可能會有另一個訊號產生。這時可能造成第一個調用被中斷而進行第二個訊號處理函數的調用。當第二個調用結束後再繼續第一個調用的執行。這將會對函數的運行造成影響,特別是對使用了靜態變數的程式。對這種情況,可以調用函數sigaction 設定SA_NODEFER 來阻塞第二個訊號。

此外,在一個繁忙的系統中,對於涉及到系統時間的操作,可能會與預期的效果有所不同。例如在alarm 調用後調用了函數pause,希望在alarm 設定的警示發生時結束pause 狀態。但由於系統過於繁忙而使此進程分到的時間片過少,當警示發生時,函數pause 還未被調用到,則當函數pause 被調用到時將可能造成進程被永遠掛起。

-----(以上摘自《linux環境c編程指南》)

查看全套文章:http://www.bianceng.cn/Programming/C/201212/34807.htm

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.