linux多線程求和_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會自己處理子進程終止的問題。

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內核已經向應用程序交付了產生的信號,只是應用程序直接丟棄了該信號而已。

10 sleep和nanosleep,如果沒有在它調用之前設置信號屏蔽字的話,都可能會被信號處理函數打斷。參見sleep和nanosleep的mannual。

轉自:http://blog.chinaunix.net/uid-12274566-id-3050955.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276193.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276193.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276193.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Elon Musk

人物事件 成長學習 1971年6月28日,埃隆馬斯克在南非的比勒陀利亞出生,他的 埃隆馬斯克 父親是一名南非機電工程師,母親是加拿大人,從事營養師兼模特。[8] 1981年,10歲的馬斯克就擁有了自己的第一臺電腦,并…

真誠推薦這7個大佬的公眾號,碎片化學習

逆水行舟,不進則退。我們的工作已經占用了大塊的時間了,剩下的只有各種碎片,最適合碎片時間學習的,莫過于優質的技術干貨公眾號啦~以下這些是小編精選,里面有很多資訊和資源,內含干貨,希望能給大…

[轉]Windows 7 產品密鑰是否安全

提到Windows 7(或Windows Server 2008)有些人認為自己的產品密鑰(Product Key)很安全,甚至在公司內部有些網管也認為公司部署的Windows 7 系統的密鑰不會泄露。但其實并非如此,眾所周知我們的密鑰都是寫在注…

HttpWatch的Result中出現Aborted的原因分析[配圖]

轉載鏈接:http://www.cnblogs.com/yutiansanshou/archive/2013/02/01/2889486.html 我們在使用HttpWatch進行Web調試的過程中有時候會看到非HTTP Status Code(狀態碼)的值, 例如:(Aborted)。 (Aborted)是HttpWatch中定…

android顯示布局邊界的邊距_Android設計規范 Material Design-Layout(2 度量與邊框)

度量與邊框基準網絡所有組件都與間隔為8dp的基準網格對齊。排版/文字(Type)與間隔為4dp的基準網格對齊。在工具條中的圖標同樣與間隔為4dp的基準網格對齊。這些規則適用于移動設備、平板設備以及桌面應用程序。有關詳細信息請參見組件一節。有關詳細信息請參見字體排版一節。邊…

《大規模分布式系統架構與設計實戰》

《大規模分布式系統架構與設計實戰》 基本信息 作者: 彭淵 叢書名: 大數據技術叢書 出版社:機械工業出版社 ISBN:9787111455035 上架時間:2014-2-21 出版日期:2014 年2月 開本:16開 頁碼&…

WINDOWS下的squid

今天寫這篇教程目的在于分享自己在WINDOWS主機下配置squid的方法。哪些地方寫的不完善或是不完整或是需要修改的地方,大家可以提出。我會第一時間糾正。下面看正文部分。先提條件,您預安裝配置squid的這臺計算機必須是聯入網絡的,系統版本是w…

Provide/inject 真的可以取代 Vuex 嗎?

Hello,各位小伙伴,接下來的一段時間里,我會把我的課程《Vue.js 3.0 核心源碼解析》中問題的答案陸續在我的公眾號發布,由于課程的問題大多數都是開放性的問題,所以我的答案也不一定是標準的,僅供你參考喔。…

php 計算代碼執行時間

轉載鏈接:http://blog.csdn.net/php_boy/article/details/6450678 class runtime {var $StartTime 0;var $StopTime 0;function get_microtime(){list($usec, $sec) explode( , microtime());return ((float)$usec (float)$sec);}function start(){$this->S…

參數方程求二階偏導_偏微分方程

常微分方程(ODE) 的時候我們更多是關于時間的導數。偏微分方程(partial differential equation) 則不僅僅是與時間相關,加上了與空間位置相關的一些信息。解當 ODE 滿足 利普希茨連續(Lipschitz continuity&#xff09…

Spring Batch 批量處理策略

為了幫助設計和實現批量處理系統,基本的批量應用是通過塊和模式來構建的,同時也應該能夠為程序開發人員和設計人員提供結構的樣例和基礎的批量處理程序。當你開始設計一個批量作業任務的時候,商業邏輯應該被拆分一系列的步驟,而這…

CString原理介紹

看了很多人寫的程序,包括我自己寫的一些代碼,發現很大的一部分bug是關于MFC類中的CString的錯誤用法的.出現這種錯誤的原因主要是對CString的實現機制不是太了解。 CString是對于原來標準c中字符串類型的一種的包裝。因為,通過很長時間的編程&#xff0c…

如何從零開始開發一個 Chrome 插件?

什么是瀏覽器插件?簡單來說瀏覽器插件,是瀏覽器上的一種工具,可以提供一些瀏覽器沒有的功能,幫你做一些有趣的事情。開發者可以根據自己的喜歡,去實現一些功能。插件基于Web技術(html、css、js)…

mysql 重復字段查詢及排除重復值

轉載鏈接:http://blog.sina.com.cn/s/blog_3edc5e2e010131ys.html mysql 重復字段查詢及排除重復值 SELECT a.id,a.title FROM dede_archives a left join dede_taglist t on t.taga.title WHERE t.typeid$id and t.arcrank>-1 and a.typeid28 group by t.tag; …

swiper移入暫停_react中swiper注意事項及鼠標劃入停止輪播

首先是實例化swiper這里有一個注意點,就是實例化的時機如果你的swiper內容是寫死的,可以在componentDidMount中實例化,但是如果你的內容是通過接口異步請求過來的,就必須在componentDidUpdate里實例化,因為如果在 comp…

轉Excel的一種簡單方法

寫了這么久的程序﹐越來越喜歡那種簡單的解決方法﹐這段時間在做一個報表系統﹐其中有需要轉Excel﹐而且要求兼容openoffice﹐遂利用asp語法,asp.net的控件封裝特性以及excel 2003的xml試算清格式做了一個看起來比較"清爽"的excel轉檔方案。一.開始原理很簡單﹐excel…

詳解MySQL中EXPLAIN解釋命令

轉載鏈接:http://database.51cto.com/art/200912/168453.htm explain顯示了mysql如何使用索引來處理select語句以及連接表。可以幫助選擇更好的索引和寫出更優化的查詢語句。 使用方法,在select語句前加上explain就可以了: 如:…

Shell編程基礎

我們可以使用任意一種文字編輯器,比如gedit、kedit、emacs、vi等來編寫shell腳本,它必須以如下行開始(必須放在文件的第一行): # !/bin/sh ...注意:最好使用“!/bin/bash”而不是“!/bin/sh”,…

總結:自學前端的高效學習路線

提到前端,大多數人都會想到薪資高。也正因為如此,很多人想要從事前端開發這個崗位,也由此衍生出來一個問題:為什么前端工程師供不應求,但還是有很多學前端的人找不到工作?其實行業不是缺前端工程師&#xf…

機器人出魔切還是三相_英雄聯盟:輔助也要去上單,機器人布里茨玩法介紹

英雄聯盟:輔助也要去上單,機器人布里茨玩法介紹出裝方面我們都知道他的被動是可以將法力值化為機的護盾的,而這樣的話裝備就可以選擇魔切,然后再出一個鞋子,為什么不先出三項呢?三項的性價比是比較高的&…