linux wait 信號丟失,wait函數族和SIGCHLD信號的關系

一、wait()和waitpid()函數的區別

pid_t wait(int *status)

進程一旦調用了wait,就立即阻塞自己,由wait自動分析是

否當前進程的某個子進程已經退出,如果讓它找到了這樣一個

已經變成僵尸的子進程, wait就會收集這個子進程的信息,并

把它徹底銷毀后返回;如果沒有找到這樣一個子進程,wait就

會一直阻塞在這里,直到有一個出現為止。

參數status用來保存被收集進程退出時的一些狀態,它是

一個指向int類型的指針。但如果我們對這個子進程是如何死掉

的毫不在意,只想把這個僵尸進程消滅掉,(事實上絕大多數

情況下,我們都會這樣想),我們就可以設定這個參數為

NULL,就象下面這樣:     pid = wait(NULL);

如果成功,wait會返回被收集的子進程的進程ID,如果調用進

程沒有子進程,調用就會失敗,此時wait返回-1,同時errno被

置為ECHILD。

waitpid的函數原型是:

waitpid系統調用在Linux函數庫中的原型是:

#include #include

pid_t waitpid(pid_t pid,int *status,int options)

從本質上講,系統調用waitpid和wait的作用是完全相同

的,但waitpid多出了兩個可由用戶控制的參數pid和options,

從而為我們編程提供了另一種更靈活的方式。

下面我們就來詳細介紹一下這兩個參數:

● pid     從參數的名字pid和類型pid_t中就可以看出,

這里需要的是一個進程ID。但當pid取不同的值時,在這里有不

同的意義。     pid>0時,只等待進程ID等于pid的子進

程,不管其它已經有多少子進程運行結束退出了,只要指定的

子進程還沒有結束,waitpid就會一直等下去。     pid=-

1時,等待任何一個子進程退出,沒有任何限制,此時waitpid

和wait的作用一模一樣。     pid=0時,等待同一個進程

組中的任何子進程,如果子進程已經加入了別的進程組,

waitpid不會對它做任何理睬。     pid

指定進程組中的任何子進程,這個進程組的ID等于pid的絕對

值。

● options   options提供了一些額外的選項來控制waitpid,

目前在Linux中只支持WNOHANG和WUNTRACED兩個選項,

這是兩個常數,可以用"|"運算符把它們連接起來使用,比如:

ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);

如果我們不想使用它們,也可以把options設為0,如:

ret=waitpid(-1,NULL,0);     如果使用了WNOHANG參數

調用waitpid,即使沒有子進程退出,它也會立即返回,不會像

wait那樣永遠等下去。     而WUNTRACED參數,由于

涉及到一些跟蹤調試方面的知識,加之極少用到,這里就不多

費筆墨了,有興趣的讀者可以自行查閱相關材料。    看

到這里,聰明的讀者可能已經看出端倪了--wait不就是經過包裝

的waitpid嗎?沒錯,察看/include/unistd.h文

件349-352行就會發現以下程序段:     static inline

pid_t wait(int * wait_stat)   {    return waitpid(-

1,wait_stat,0);   }      返回值和錯誤

waitpid的返回值比wait稍微復雜一些,一共有3種情況:

● 當正常返回的時候,waitpid返回收集到的子進程的進程ID;

● 如果設置了選項WNOHANG,而調用中waitpid發現沒有已

退出的子進程可收集,則返回0;

● 如果調用中出錯,則返回-1,這時errno會被設置成相應的

值以指示錯誤所在;當pid所指示的子進程不存在,或此進程存

在,但不是調用進程的子進程,waitpid就會出錯返回,這時

errno被設置為ECHILD 其它: 調用 wait&waitpid 來處理終止

的子進程: pid_t wait(int * statloc); pid_t waitpid(pid_t pid,

int *statloc, int options); 兩個函數都返回兩個值:函數的返回

值和終止的子進程ID,而子進程終止的狀態則是通過statloc指

針返回的。 wait&waitpid 的區別是顯而易見的,wait等待第一

個終止的子進程,而waitpid則可以指定等待特定的子進程。這

樣的區別可能會在下面這種情況時表現得更加明顯:當同時有

5個客戶連上服務器,也就是說有五個子進程分別對應了5個客

戶,此時,五個客戶幾乎在同時請求終止,這樣一來,幾乎同

時,五個FIN發向服務器,同樣的,五個SIGCHLD信號到達服

務器,然而,UNIX的信號往往是不會排隊的,顯然這樣一來,

信號處理函數將只會執行一次,殘留剩余四個子進程作為僵尸

進程駐留在內核空間。此時,正確的解決辦法是利用waitpid(-

1, &stat, WNOHANG)防止留下僵尸進程。其中的pid為-1表

明等待第一個終止的子進程,而WNOHANG選擇項通知內核在

沒有已終止進程項時不要阻塞。

wait&waitpid 區別 :

waitpid提供了wait函數不能實現的3個功能: waitpid等待特定的

子進程, 而wait則返回任一終止狀態的子進程; waitpid提供了一

個wait的非阻塞版本; waitpid支持作業控制(以WUNTRACED選

項). 用于檢查wait和waitpid兩個函數返回終止狀態的宏: 這兩個

函數返回的子進程狀態都保存在statloc指針中, 用以下3個宏可

以檢查該狀態: WIFEXITED(status): 若為正常終止, 則為真. 此

時可執行 WEXITSTATUS(status): 取子進程傳送給exit或_exit

參數的低8位. WIFSIGNALED(status): 若為異常終止, 則為真.

此時可執行 WTERMSIG(status): 取使子進程終止的信號編號.

WIFSTOPPED(status): 若為當前暫停子進程, 則為真. 此時可

執行 WSTOPSIG(status): 取使子進程暫停的信號編號

二、SIGCHLD信號

簡單的說,子進程退出時父進程會收到一個SIGCHLD信號,默認的處理是忽略這個信號,而常規的做法是在這個信號處理函數中調用wait函數獲取子進程的退出狀態。

三、既然在SIGCHLD信號的處理函數中要調用wait函數族,為什么有了wait函數族還需要使用SIGCHLD信號?

我們知道,unix中信號是采用異步處理某事的機制,好比說你準備去做某事,去之前跟鄰居張三說如果李四來找你的話就通知他一聲,這讓你可以抽身出來去做這件事,而李四真正來訪時會有人通知你,這個就是異步信號一個較為形象的比喻。

一般的,父進程在生成子進程之后會有兩種情況:一是父進程繼續去做別的事情,類似上面舉的例子;另一是父進程啥都不做,一直在wait子進程退出,因為有時候父進程依賴子進程干完某事后才能繼續 。

SIGCHLD信號就是為這第一種情況準備的,它讓父進程去做別的事情,而只要父進程注冊了處理該信號的函數,在子進程退出時就會調用該函數,在函數中wait子進程得到終止狀態之后再繼續做父進程的事情。

最后,我們來明確以下二點:

1)凡父進程不調用wait函數族獲得子進程終止狀態的子進程在退出時都會變成僵尸進程。

2)SIGCHLD信號可以異步的通知父進程有子進程退出。

signal(SIGCHLD, SIG_IGN);

//忽略SIGCHLD信號,這常用于并發服務器的性能的一個技巧

//因為并發服務器常常fork很多子進程,子進程終結之后需要

//服務器進程去wait清理資源。如果將此信號的處理方式設為

//忽略,可讓內核把僵尸子進程轉交給init進程去處理,省去了

//大量僵尸進程占用系統資源。(Linux Only)

some code();

pid = fork(); //生成一個子進程

if (pid < 0) // error check.

handle_err();

if (pid == 0)

exit (execl(....)); // child process.

else

if (wait(&ret) < 0)

perror(\"wait\"); //parent process

//在這里wait,都會得No Such process的錯誤,

//因為子進程終止后,內核會向父進程發送SIGCHLD

//信號,但是上面已將此信號設為忽略,實質上由

//init來接收此子進程的處理。

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

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

相關文章

linux socket接收不到16進制數據,C下通過socket收發十六進制數據解決辦法

C下通過socket收發十六進制數據系統是在LINUX下&#xff0c;下位機發送十六進制數據過來 上位機怎么解析 把數據以十六進制的形式顯示出來&#xff0c;發送十六進制又如何實現------解決方案--------------------socket不就是發16進制的么------解決方案--------------------那…

c語言 字符串 url,如何對URL字符串進行百分號編碼

在和web服務進行交互時&#xff0c;我們經常需要對URL中的特定字符和傳輸的表單數據進行百分號編碼。例如&#xff0c;’&’在百分號編碼時會變成’%26’。搞清楚 URL中哪部分的哪些字符應該進行百分號編碼了并不是件易事。最好的資料好像是RFC 3986和W3C HTML5。出于興趣和…

擊鼓傳花擊鼓次數相同c語言,JavaScript 實現擊鼓傳花游戲

大家小時候應該都玩過擊鼓傳花(Hot Potato)的游戲吧&#xff01;一群小孩圍成一個圓圈&#xff0c;把花盡快的傳給旁邊的人。某一時刻傳花停止&#xff0c;這時花在誰手里&#xff0c;誰就退出圓圈結束游戲。重復此過程&#xff0c;直到剩下最后一個孩子&#xff0c;即為勝者。…

c語言查找字符串au,幾個C語言詞匯不懂,望老鳥們相助(俺是新手哦)

幾個C語言詞匯 auto break case char const continue default do double else enum extern float for goto if int long registerreturn short signed幾個C語言詞匯 auto break case char const continue default do double else enum extern float for goto if int long regis…

c語言中 %.2s,C2S是什么意思

1. The testing result indicates that TiO_2 has mineralized effect on C_2S, at the same time flux effect on reducing low general melting point of CaO-SiO_2 system and yielding much liquid phase, TiO_2 has definite stabilized effect on β-C_2S.結果隨著TiO2摻…

前端的c語言面試題,前端工程師面試題匯總(選擇題)

前端工程師面試題匯總(選擇題)時間&#xff1a;2017-12-05 來源&#xff1a;前端工程師面試題推薦作為一名前端工程師&#xff0c;我們必不可少的就是參加面試&#xff0c;面試過程中會遇到各類奇葩的問題&#xff0c;今天小編為大家匯總了一些相關的問題&#xff0c;希望可…

用英文單詞模擬數字計算c語言,C語言程序設計用英文單詞模擬數學計算

匿名用戶1級2010-05-09 回答最后輸出是用的是阿拉伯數字&#xff0c;這個你再改改吧&#xff0c; 小問題了。。。。#include #include #include #include #include int carry 0;int parse_int(const char *s, int len){char tens[10], units[10];memset(tens, 0, sizeof(tens)…

c語言猜數字游戲新建,C語言編程 如何構建一個簡單的猜數字小游戲

#include//生成隨機函數起點時用到time.hint main(){int number1 0, choice 0, number2 0;printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");//界面設置printf("$$$$$ 歡 迎 來 到 $$$$$\n");printf("$$$$$ 猜 數 字 …

c語言循環拆分成和,C語言拆分循環鏈表程序

創建一個循環鏈表&#xff0c;并將這個循環鏈表拆分成為兩個循環鏈表的示例程序&#xff0c;將以下代碼保存到一個源文件中&#xff1a;split_circular_linked_list.c&#xff0c; 如下所示 –#include #include struct node { int data; struct node *next; }; struct node *e…

pic單片機c語言讀eeprom,PIC16F877單片機內部EEPROM讀寫實例

;PIC16F877單片機內部EEPROM讀寫實例****************************************************************************************; This is a program to test the function of reading&writting for EEPROM.; YouCANOBServe the value of register(30H--?) buy changin…

C語言運行gis空間疊加分析,GIS空間疊加分析與緩沖區分析.doc

《地理信息系統》報告專 業 資源環境與城鄉規劃管理 姓 名 成 績班 級 學 號 日 期 2014/6/20目錄TOC \o "1-2" \h \u 14469 一、題目 23290 二、設計目的27200 三、設計背景2四、設計內容27200 四、步驟與過程27200 五、專題地圖 37521 四、總結分析 9題目佛山市順德…

組件文件已損壞或android內部模塊,android - Android Q更新后,模塊化系統組件在托管配置文件中不可用 - 堆棧內存溢出...

在從工作配置文件配置的設備設置應用中將操作系統從Android 9升級到10后&#xff0c;請停止運行。java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.settings/com.android.settings.applications.InstalledAppDetailsTop}: java.lang.NullPoin…

android文本復制自定義剪切板,android 剪切板-文本復制、粘貼

1. 粘貼&#xff0d;文本保存到剪切板中ClipboardManager clipboardManager (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);//創建ClipData對象ClipData clipData ClipData.newPlainText("orderNo", txt);//添加ClipData對象到剪切板中…

android保持服務不休眠,Android開發保持屏幕常亮和CPU不休眠喚醒狀態

安卓手機 APP 開發&#xff0c;有的時候需要屏幕長時間亮著&#xff0c;也就是不鎖屏&#xff0c;這時CPU會一直處于不休眠喚醒狀態。下面介紹兩種方法。方法一&#xff1a;通過 PowerManager 實現。此種方法會在軟件安裝時用戶可以看到屏幕選項。首先&#xff0c;在 AndroidMa…

android 磁場傳感器 羅盤,Android開發獲取重力加速度和磁場強度的方法

本文實例講述了Android開發獲取重力加速度和磁場強度的方法。分享給大家供大家參考&#xff0c;具體如下&#xff1a;Android獲取重力加速度和磁場強度主要依靠&#xff1a;Sensor.getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)輸入數據&am…

android spinner位置,在Android中的Spinner中沒有選擇位置0

我創建了一個有三個項目的微調器日常每周每月一次我在我的java文件中執行了以下操作&#xff1a;navSpinner new ArrayList();navSpinner.add(new SpinnerNavItem(getResources().getString(R.string.dailyview)));navSpinner.add(new SpinnerNavItem(getResources().getStrin…

android tombstone發生過程,Android Tombstone解決步驟

這周和同事一起解了個tombstone的bug, 記錄下分析的過程&#xff0c;免得以后又忘記。。。1>log的分析pid: 122, tid: 14745, name: Binder_2 >>> /system/bin/mediaserver <<<signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000058eax 00000…

優酷android手機客戶端for,優酷手機客戶端

優酷手機客戶端官方最新版是官方出品的最新版播放軟件&#xff0c;該軟件上面匯聚了其他視頻app上沒有的精彩節目&#xff0c;全國各大精彩劇集與電影免費首播&#xff0c;更有獨特高清藍光畫質播放&#xff0c;想要體驗的朋友可以來欣賞一下!軟件特點1、高清流暢播放2、國內外…

html在線編輯器 asp.net,ASP.NET網站使用Kindeditor富文本編輯器配置步驟

1. 下載編輯器下載 KindEditor 最新版本&#xff0c;下載頁面: http://www.kindsoft.net/down.php2. 部署編輯器解壓 kindeditor-x.x.x.zip 文件&#xff0c;將editor文件夾復制到web目錄下3、在網頁中加入(ValidateRequest"false")4、引入腳本文件(XXX部分需要修改)…

html表格中綁定顯示xml文檔內容的簡單實例,JS讀取XML文件數據并以table形式顯示數據的方法(兼容IE與火狐)...

本文實例講述了JS讀取XML文件數據并以table形式顯示數據的方法。分享給大家供大家參考&#xff0c;具體如下&#xff1a;先看xml文件&#xff1a;張秋麗女 18李文才男 31李斯文男 22馬英女 25孫紅雷男 32歐陽俊雄男 28江琳女 23小小女 22aspx頁面代碼&#xff1a;function load…