Linux下訊號處理與多線程程式

來源:互聯網
上載者:User

    看APUE,得到些感性認識,然而不同的實現對於一些函數語意實現並不相同,導致編程時會出現一些混淆。下面記錄一些容易混淆的地方。

    1 signal函數 BSD/Linux的實現並不在訊號處理函數調用時,恢複訊號的處理為預設,而是在訊號處理時阻塞此訊號,直到訊號處理函數返回。其他實現可能在調用訊號處理函數時,恢複訊號的處理為預設,因而需要在訊號處理函數中重建訊號處理函數為我們定義的處理函數,在這些系統中,較好的方法是使用sigaction來建立訊號處理函數。

    2 發送訊號給進程,哪個線程會收到? APUE說,在多線程的程式中,如果不做特殊的訊號阻塞處理,當發送訊號給進程時,由系統選擇一個線程來處理這個訊號。

    3 如果進程中,有的線程可以屏蔽了某個訊號,而某些線程可以處理這個訊號,則當我們發送這個訊號給進程或者進程中不能處理這個訊號的線程時,系統會將這個訊號投遞到進程號最小的那個可以處理這個訊號的線程中去處理。

    4 如果我們同時註冊了訊號處理函數,同時又用sigwait來等待這個訊號,誰會取到訊號?經過實驗,Linux上sigwait的優先順序高。

    5 在Linux中的posix執行緒模式中,線程擁有獨立的進程號,可以通過getpid()得到線程的進程號,而線程號儲存在pthread_t的值中。而主線程的進程號就是整個進程的進程號,因此向主進程發送訊號只會將訊號發送到主線程中去。如果主線程設定了訊號屏蔽,則訊號會投遞到一個可以處理的線程中去。

 

    6 當調用SYSTEM函數去執行SHELL命令時,可以放心的阻塞SIGCHLD,因為SYSTEM會自己處理子進程終止的問題。

 

    7 使用sleep()時,要以放心的去阻塞SIGALRM訊號,目前sleep函數都不會依賴於ALRM函數的SIGALRM訊號來工作。

 

未完待續

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.