linux多线程求和_linux 多线程信号处理总结
linux 多線程信號(hào)總結(jié)(一)
1. 在多線程環(huán)境下,產(chǎn)生的信號(hào)是傳遞給整個(gè)進(jìn)程的,一般而言,所有線程都有機(jī)會(huì)收到這個(gè)信號(hào),進(jìn)程在收到信號(hào)的的線程上下文執(zhí)行信號(hào)處理函數(shù),具體是哪個(gè)線程執(zhí)行的難以獲知。也就是說(shuō),信號(hào)會(huì)隨機(jī)發(fā)個(gè)該進(jìn)程的一個(gè)線程。
2 signal函數(shù)BSD/Linux的實(shí)現(xiàn)并不在信號(hào)處理函數(shù)調(diào)用時(shí),恢復(fù)信號(hào)的處理為默認(rèn),而是在信號(hào)處理時(shí)阻塞此信號(hào),直到信號(hào)處理函數(shù)返回。其他實(shí)現(xiàn)可能在調(diào)用信號(hào)處理函數(shù)時(shí),恢復(fù)信號(hào)的處理為默認(rèn)方式,因而需要在信號(hào)處理函數(shù)中重建信號(hào)處理函數(shù)為我們定義的處理函數(shù),在這些系統(tǒng)中,較好的方法是使用sigaction來(lái)建立信號(hào)處理函數(shù)。
3 發(fā)送信號(hào)給進(jìn)程,哪個(gè)線程會(huì)收到?APUE說(shuō),在多線程的程序中,如果不做特殊的信號(hào)阻塞處理,當(dāng)發(fā)送信號(hào)給進(jìn)程時(shí),由系統(tǒng)選擇一個(gè)線程來(lái)處理這個(gè)信號(hào)。
4 如果進(jìn)程中,有的線程可以屏蔽了某個(gè)信號(hào),而某些線程可以處理這個(gè)信號(hào),則當(dāng)我們發(fā)送這個(gè)信號(hào)給進(jìn)程或者進(jìn)程中不能處理這個(gè)信號(hào)的線程時(shí),系統(tǒng)會(huì)將這個(gè)信號(hào)投遞到進(jìn)程號(hào)最小的那個(gè)可以處理這個(gè)信號(hào)的線程中去處理。
5 如果我們同時(shí)注冊(cè)了信號(hào)處理函數(shù),同時(shí)又用sigwait來(lái)等待這個(gè)信號(hào),誰(shuí)會(huì)取到信號(hào)?經(jīng)過(guò)實(shí)驗(yàn),Linux上sigwait的優(yōu)先級(jí)高。
6 在Linux中的posix線程模型中,線程擁有獨(dú)立的進(jìn)程號(hào),可以通過(guò)getpid()得到線程的進(jìn)程號(hào),而線程號(hào)保存在pthread_t的值中。而主線程的進(jìn)程號(hào)就是整個(gè)進(jìn)程的進(jìn)程號(hào),因此向主進(jìn)程發(fā)送信號(hào)只會(huì)將信號(hào)發(fā)送到主線程中去。如果主線程設(shè)置了信號(hào)屏蔽,則信號(hào)會(huì)投遞到一個(gè)可以處理的線程中去。
7 當(dāng)調(diào)用SYSTEM函數(shù)去執(zhí)行SHELL命令時(shí),可以放心的阻塞SIGCHLD,因?yàn)镾YSTEM會(huì)自己處理子進(jìn)程終止的問(wèn)題。
8 使用sleep()時(shí),要以放心的去阻塞SIGALRM信號(hào),目前sleep函數(shù)都不會(huì)依賴于ALRM函數(shù)的SIGALRM信號(hào)來(lái)工作。
linux 多線程信號(hào)總結(jié)(二)
1. 默認(rèn)情況下,信號(hào)將由主進(jìn)程接收處理,就算信號(hào)處理函數(shù)是由子線程注冊(cè)的
2. 每個(gè)線程均有自己的信號(hào)屏蔽字,可以使用sigprocmask函數(shù)來(lái)屏蔽某個(gè)線程對(duì)該信號(hào)的響應(yīng)處理,僅留下需要處理該信號(hào)的線程來(lái)處理指定的信號(hào)。
3. 對(duì)某個(gè)信號(hào)處理函數(shù),以程序執(zhí)行時(shí)最后一次注冊(cè)的處理函數(shù)為準(zhǔn),即在所有的線程里,同一個(gè)信號(hào)在任何線程里對(duì)該信號(hào)的處理一定相同
4. 可以使用pthread_kill對(duì)指定的線程發(fā)送信號(hào)
APUE的說(shuō)法:每個(gè)線程都有自己的信號(hào)屏蔽字,但是信號(hào)的處理是進(jìn)程中所有的線程共享的,這意味著盡管單個(gè)線程可以阻止某些信號(hào),但當(dāng)線程修改了與某個(gè)信號(hào)相關(guān)的處理行為后,所有的線程都共享這個(gè)處理行為的改變。這樣如果一個(gè)線程選擇忽略某個(gè)信號(hào),而其他線程可以恢復(fù)信號(hào)的默認(rèn)處理行為,或者為信號(hào)設(shè)置一個(gè)新的處理程序,從而可以撤銷上述線程的信號(hào)選擇。
進(jìn)程中的信號(hào)是送到單個(gè)線程的,如果信號(hào)與硬件故障或者計(jì)時(shí)器超時(shí)有關(guān),該型號(hào)就被發(fā)送到引起該事件的線程中去,而其他的信號(hào)則被發(fā)送到任意一個(gè)線程。
sigprocmask的行為在多線程的進(jìn)程中沒(méi)有定義,線程必須使用pthread_sigmask
總結(jié):一個(gè)信號(hào)可以被沒(méi)屏蔽它的任何一個(gè)線程處理,但是在一個(gè)進(jìn)程內(nèi)只有一個(gè)多個(gè)線程共用的處理函數(shù)。......
linux 多線程信號(hào)總結(jié)(三)
1 Linux 多線程應(yīng)用中,每個(gè)線程可以通過(guò)調(diào)用pthread_sigmask() 設(shè)置本線程的信號(hào)掩碼。一般情況下,被阻塞的信號(hào)將不能中斷此線程的執(zhí)行,除非此信號(hào)的產(chǎn)生是因?yàn)槌绦蜻\(yùn)行出錯(cuò)如SIGSEGV;另外不能被忽略處理的信號(hào)SIGKILL 和SIGSTOP 也無(wú)法被阻塞。
2 當(dāng)一個(gè)線程調(diào)用pthread_create() 創(chuàng)建新的線程時(shí),此線程的信號(hào)掩碼會(huì)被新創(chuàng)建的線程繼承。
3?信號(hào)安裝最好采用sigaction方式,sigaction,是為替代signal 來(lái)設(shè)計(jì)的較穩(wěn)定的信號(hào)處理,signal的使用比較簡(jiǎn)單。signal(signalNO,signalproc);
不能完成的任務(wù)是:1.不知道信號(hào)產(chǎn)生的原因;
2.處理信號(hào)中不能阻塞其他的信號(hào)
而signaction,則可以設(shè)置比較多的消息。尤其是在信號(hào)處理函數(shù)過(guò)程中接受信號(hào),進(jìn)行何種處理。
sigaction函數(shù)用于改變進(jìn)程接收到特定信號(hào)后的行為。
4 sigprocmask函數(shù)只能用于單線程,在多線程中使用pthread_sigmask函數(shù)。
5 信號(hào)是發(fā)給進(jìn)程的特殊消息,其典型特性是具有異步性。
6 信號(hào)集代表多個(gè)信號(hào)的集合,其類型是sigset_t。
7 每個(gè)進(jìn)程都有一個(gè)信號(hào)掩碼(或稱為信號(hào)屏蔽字),其中定義了當(dāng)前進(jìn)程要求阻塞的信號(hào)集。
8?所謂阻塞,指Linux內(nèi)核不向進(jìn)程交付在掩碼中的所有信號(hào)。于是進(jìn)程可以通過(guò)修改信號(hào)掩碼來(lái)暫時(shí)阻塞特定信號(hào)的交付,被阻塞的信號(hào)不會(huì)影響進(jìn)程的行為直到該信號(hào)被真正交付。
9?忽略信號(hào)不同于阻塞信號(hào),忽略信號(hào)是指Linux內(nèi)核已經(jīng)向應(yīng)用程序交付了產(chǎn)生的信號(hào),只是應(yīng)用程序直接丟棄了該信號(hào)而已。
10 sleep和nanosleep,如果沒(méi)有在它調(diào)用之前設(shè)置信號(hào)屏蔽字的話,都可能會(huì)被信號(hào)處理函數(shù)打斷。參見(jiàn)sleep和nanosleep的mannual。
轉(zhuǎn)自:http://blog.chinaunix.net/uid-12274566-id-3050955.html
總結(jié)
以上是生活随笔為你收集整理的linux多线程求和_linux 多线程信号处理总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 设置linearlayout最大高度_技
- 下一篇: gaussian09使用教程linux,