linux 多線程信號編程總結html
linux 多線程信號總結(一)linux
1. 在多線程環境下,產生的信號是傳遞給整個進程的,通常而言,全部線程都有機會收到這個信號,進程在收到信號的的線程上下文執行信號處理函數,具體是哪一個線程執行的難以獲知。編程
2 signal函數BSD/Linux的實現並不在信號處理函數調用時,恢復信號的處理爲默認,而是在信號處理時阻塞此信號,直到信號處理函數返回。其餘實現可能在調用信號處理函數時,恢復信號的處理爲默認方式,於是須要在信號處理函數中重建信號處理函數爲咱們定義的處理函數,在這些系統中,較好的方法是使用sigaction來創建信號處理函數。多線程
3 發送信號給進程,哪一個線程會收到?APUE說,在多線程的程序中,若是不作特殊的信號阻塞處理,當發送信號給進程時,由系統選擇一個線程來處理這個信號。異步
4 若是進程中,有的線程能夠屏蔽了某個信號,而某些線程能夠處理這個信號,則當咱們發送這個信號給進程或者進程中不能處理這個信號的線程時,系統會將這個信號投遞到進程號最小的那個能夠處理這個信號的線程中去處理。函數
5 若是咱們同時註冊了信號處理函數,同時又用sigwait來等待這個信號,誰會取到信號?通過實驗,Linux上sigwait的優先級高。線程
6 在Linux中的posix線程模型中,線程擁有獨立的進程號,能夠經過getpid()獲得線程的進程號,而線程號保存在pthread_t的值中。而主線程的進程號就是整個進程的進程號,所以向主進程發送信號只會將信號發送到主線程中去。若是主線程設置了信號屏蔽,則信號會投遞到一個能夠處理的線程中去。設計
7 當調用SYSTEM函數去執行SHELL命令時,能夠放心的阻塞SIGCHLD,由於SYSTEM會本身處理子進程終止的問題。htm
8 使用sleep()時,要以放心的去阻塞SIGALRM信號,目前sleep函數都不會依賴於ALRM函數的SIGALRM信號來工做。繼承
linux 多線程信號總結(二)
1. 默認狀況下,信號將由主進程接收處理,就算信號處理函數是由子線程註冊的
2. 每一個線程均有本身的信號屏蔽字,能夠使用sigprocmask函數來屏蔽某個線程對該信號的響應處理,僅留下須要處理該信號的線程來處理指定的信號。
3. 對某個信號處理函數,以程序執行時最後一次註冊的處理函數爲準,即在全部的線程裏,同一個信號在任何線程裏對該信號的處理必定相同
4. 能夠使用pthread_kill對指定的線程發送信號
APUE的說法:每一個線程都有本身的信號屏蔽字,可是信號的處理是進程中全部的線程共享的,
這意味着儘管單個線程能夠阻止某些信號,但當線程修改了與某個信號相關的處理行爲後,所
有的線程都共享這個處理行爲的改變。這樣若是一個線程選擇忽略某個信號,而其餘線程可
以恢復信號的默認處理行爲,或者爲信號設置一個新的處理程序,從而能夠撤銷上述線程的
信號選擇。
進程中的信號是送到單個線程的,若是信號與硬件故障或者計時器超時有關,該型號就被髮
送到引發該事件的線程中去,而其餘的信號則被髮送到任意一個線程。
sigprocmask的行爲在多線程的進程中沒有定義,線程必須使用pthread_sigmask
總結:一個信號能夠被沒屏蔽它的任何一個線程處理,可是在一個進程內只有一個多個線程共用的處理函數。……
linux 多線程信號總結(三)
1 Linux 多線程應用中,每一個線程能夠經過調用pthread_sigmask() 設置本線程的信號掩碼。通常狀況下,被阻塞的信號將不能中斷此線程的執行,除非此信號的產生是由於程序運行出錯如SIGSEGV;另外不能被忽略處理的信號SIGKILL 和SIGSTOP 也沒法被阻塞。
2 當一個線程調用pthread_create() 建立新的線程時,此線程的信號掩碼會被新建立的線程繼承。
3 信號安裝最好採用sigaction方式,sigaction,是爲替代signal 來設計的較穩定的信號處理,signal的使用比較簡單。signal(signalNO,signalproc);
不能完成的任務是:1.不知道信號產生的緣由;
2.處理信號中不能阻塞其餘的信號
而signaction,則能夠設置比較多的消息。尤爲是在信號處理函數過程當中接受信號,進行何種處理。
sigaction函數用於改變進程接收到特定信號後的行爲。
4 sigprocmask函數只能用於單線程,在多線程中使用pthread_sigmask函數。
5 信號是發給進程的特殊消息,其典型特性是具備異步性。
6 信號集表明多個信號的集合,其類型是sigset_t。
7 每一個進程都有一個信號掩碼(或稱爲信號屏蔽字),其中定義了當前進程要求阻塞的信號集。
8 所謂阻塞,指Linux內核不向進程交付在掩碼中的全部信號。因而進程能夠經過修改信號掩碼來暫時阻塞特定信號的交付,被阻塞的信號不會影響進程的行爲直到該信號被真正交付。
9 忽略信號不一樣於阻塞信號,忽略信號是指Linux內核已經嚮應用程序交付了產生的信號,只是應用程序直接丟棄了該信號而已。
原文出自【比特網】,轉載請保留原文連接:http://soft.chinabyte.com/os/311/12235311.shtml