• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天之道

            享受編程的樂趣。
            posts - 118, comments - 7, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            wait 和waitpid詳解

            Posted on 2013-04-13 22:05 hoshelly 閱讀(1367) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Linux
            wait的函數(shù)原型是:  
            #include<sys/types.h>
            #include <sys/wait.h>

            pid_t wait(int *status)     
                  進(jìn)程一旦調(diào)用了wait,就立即阻塞自己,由wait自動(dòng)分析是
            否當(dāng)前進(jìn)程的某個(gè)子進(jìn)程已經(jīng)退出,如果讓它找到了這樣一個(gè)
            已經(jīng)變成僵尸的子進(jìn)程, wait就會(huì)收集這個(gè)子進(jìn)程的信息,并
            把它徹底銷毀后返回;如果沒有找到這樣一個(gè)子進(jìn)程,wait就
            會(huì)一直阻塞在這里,直到有一個(gè)出現(xiàn)為止。    
                  參數(shù)status用來保存被收集進(jìn)程退出時(shí)的一些狀態(tài),它是
            一個(gè)指向int類型的指針。但如果我們對(duì)這個(gè)子進(jìn)程是如何死掉
            的毫不在意,只想把這個(gè)僵尸進(jìn)程消滅掉,(事實(shí)上絕大多數(shù)
            情況下,我們都會(huì)這樣想),我們就可以設(shè)定這個(gè)參數(shù)為
            NULL,就象下面這樣:     pid = wait(NULL);
            如果成功,wait會(huì)返回被收集的子進(jìn)程的進(jìn)程ID,如果調(diào)用進(jìn)
            程沒有子進(jìn)程,調(diào)用就會(huì)失敗,此時(shí)wait返回-1,同時(shí)errno被
            置為ECHILD。 
                  waitpid的函數(shù)原型是:   
            waitpid系統(tǒng)調(diào)用在Linux函數(shù)庫中的原型是:   
            #include <sys/types.h>#include <sys/wait.h>

            pid_t waitpid(pid_t pid,int *status,int options)
                  從本質(zhì)上講,系統(tǒng)調(diào)用waitpid和wait的作用是完全相同
            的,但waitpid多出了兩個(gè)可由用戶控制的參數(shù)pid和options,
            從而為我們編程提供了另一種更靈活的方式。
            下面我們就來詳細(xì)介紹一下這兩個(gè)參數(shù):     
            ● pid     從參數(shù)的名字pid和類型pid_t中就可以看出,
            這里需要的是一個(gè)進(jìn)程ID。但當(dāng)pid取不同的值時(shí),在這里有不
            同的意義。     pid>0時(shí),只等待進(jìn)程ID等于pid的子進(jìn)
            程,不管其它已經(jīng)有多少子進(jìn)程運(yùn)行結(jié)束退出了,只要指定的
            子進(jìn)程還沒有結(jié)束,waitpid就會(huì)一直等下去。     pid=-
            1時(shí),等待任何一個(gè)子進(jìn)程退出,沒有任何限制,此時(shí)waitpid
            和wait的作用一模一樣。     pid=0時(shí),等待同一個(gè)進(jìn)程
            組中的任何子進(jìn)程,如果子進(jìn)程已經(jīng)加入了別的進(jìn)程組,
            waitpid不會(huì)對(duì)它做任何理睬。     pid<-1時(shí),等待一個(gè)
            指定進(jìn)程組中的任何子進(jìn)程,這個(gè)進(jìn)程組的ID等于pid的絕對(duì)
            值。   
            ● options   options提供了一些額外的選項(xiàng)來控制waitpid,
            目前在Linux中只支持WNOHANG和WUNTRACED兩個(gè)選項(xiàng),
            這是兩個(gè)常數(shù),可以用"|"運(yùn)算符把它們連接起來使用,比如:
              ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);   
            如果我們不想使用它們,也可以把options設(shè)為0,如:   
            ret=waitpid(-1,NULL,0);     如果使用了WNOHANG參數(shù)
            調(diào)用waitpid,即使沒有子進(jìn)程退出,它也會(huì)立即返回,不會(huì)像
            wait那樣永遠(yuǎn)等下去。     而WUNTRACED參數(shù),由于
            涉及到一些跟蹤調(diào)試方面的知識(shí),加之極少用到,這里就不多
            費(fèi)筆墨了,有興趣的讀者可以自行查閱相關(guān)材料。    看
            到這里,聰明的讀者可能已經(jīng)看出端倪了--wait不就是經(jīng)過包裝
            的waitpid嗎?沒錯(cuò),察看<內(nèi)核源碼目錄>/include/unistd.h文
            件349-352行就會(huì)發(fā)現(xiàn)以下程序段:     static inline
            pid_t wait(int * wait_stat)   {    return waitpid(-
            1,wait_stat,0);   }      返回值和錯(cuò)誤     
            waitpid的返回值比wait稍微復(fù)雜一些,一共有3種情況:  
            ● 當(dāng)正常返回的時(shí)候,waitpid返回收集到的子進(jìn)程的進(jìn)程ID;
            ● 如果設(shè)置了選項(xiàng)WNOHANG,而調(diào)用中waitpid發(fā)現(xiàn)沒有已
            退出的子進(jìn)程可收集,則返回0;      
            ● 如果調(diào)用中出錯(cuò),則返回-1,這時(shí)errno會(huì)被設(shè)置成相應(yīng)的
            值以指示錯(cuò)誤所在;當(dāng)pid所指示的子進(jìn)程不存在,或此進(jìn)程存
            在,但不是調(diào)用進(jìn)程的子進(jìn)程,waitpid就會(huì)出錯(cuò)返回,這時(shí)
            errno被設(shè)置為ECHILD 其它: 調(diào)用 wait&waitpid 來處理終止
            的子進(jìn)程: pid_t wait(int * statloc); pid_t waitpid(pid_t pid,
            int *statloc, int options); 兩個(gè)函數(shù)都返回兩個(gè)值:函數(shù)的返回
            值和終止的子進(jìn)程ID,而子進(jìn)程終止的狀態(tài)則是通過statloc指
            針返回的。 wait&waitpid 的區(qū)別是顯而易見的,wait等待第一
            個(gè)終止的子進(jìn)程,而waitpid則可以指定等待特定的子進(jìn)程。這
            樣的區(qū)別可能會(huì)在下面這種情況時(shí)表現(xiàn)得更加明顯:當(dāng)同時(shí)有
            5個(gè)客戶連上服務(wù)器,也就是說有五個(gè)子進(jìn)程分別對(duì)應(yīng)了5個(gè)客
            戶,此時(shí),五個(gè)客戶幾乎在同時(shí)請(qǐng)求終止,這樣一來,幾乎同
            時(shí),五個(gè)FIN發(fā)向服務(wù)器,同樣的,五個(gè)SIGCHLD信號(hào)到達(dá)服
            務(wù)器,然而,UNIX的信號(hào)往往是不會(huì)排隊(duì)的,顯然這樣一來,
            信號(hào)處理函數(shù)將只會(huì)執(zhí)行一次,殘留剩余四個(gè)子進(jìn)程作為僵尸
            進(jìn)程駐留在內(nèi)核空間。此時(shí),正確的解決辦法是利用waitpid(-
            1, &stat, WNOHANG)防止留下僵尸進(jìn)程。其中的pid為-1表
            明等待第一個(gè)終止的子進(jìn)程,而WNOHANG選擇項(xiàng)通知內(nèi)核在
            沒有已終止進(jìn)程項(xiàng)時(shí)不要阻塞。
            wait&waitpid 區(qū)別 :
            waitpid提供了wait函數(shù)不能實(shí)現(xiàn)的3個(gè)功能: waitpid等待特定的
            子進(jìn)程, 而wait則返回任一終止?fàn)顟B(tài)的子進(jìn)程; waitpid提供了一
            個(gè)wait的非阻塞版本; waitpid支持作業(yè)控制(以WUNTRACED選
            項(xiàng)). 用于檢查wait和waitpid兩個(gè)函數(shù)返回終止?fàn)顟B(tài)的宏: 這兩個(gè)
            函數(shù)返回的子進(jìn)程狀態(tài)都保存在statloc指針中, 用以下3個(gè)宏可
            以檢查該狀態(tài): WIFEXITED(status): 若為正常終止, 則為真. 此
            時(shí)可執(zhí)行 WEXITSTATUS(status): 取子進(jìn)程傳送給exit或_exit
            參數(shù)的低8位. WIFSIGNALED(status): 若為異常終止, 則為真.
            此時(shí)可執(zhí)行 WTERMSIG(status): 取使子進(jìn)程終止的信號(hào)編號(hào).
            WIFSTOPPED(status): 若為當(dāng)前暫停子進(jìn)程, 則為真. 此時(shí)可
            執(zhí)行 WSTOPSIG(status): 取使子進(jìn)程暫停的信號(hào)編號(hào)
            久久精品国产亚洲AV久| 久久综合久久伊人| 久久久久久久尹人综合网亚洲| 国产A三级久久精品| 国产精品久久久久久福利漫画| 老司机国内精品久久久久| 国内精品久久久久久久亚洲| 日韩欧美亚洲综合久久| AAA级久久久精品无码片| 久久国产成人午夜AV影院| 嫩草伊人久久精品少妇AV| 久久综合一区二区无码| 2021久久国自产拍精品| 午夜精品久久久久成人| 午夜不卡888久久| 色婷婷综合久久久中文字幕| 人妻中文久久久久| 久久99国产亚洲高清观看首页| 久久亚洲国产精品成人AV秋霞| 狠色狠色狠狠色综合久久 | 精品亚洲综合久久中文字幕| 久久久精品国产亚洲成人满18免费网站 | 久久精品中文闷骚内射| 日日狠狠久久偷偷色综合96蜜桃| 青青草原精品99久久精品66| 欧美精品丝袜久久久中文字幕| 狠狠色婷婷综合天天久久丁香 | 色狠狠久久综合网| 久久e热在这里只有国产中文精品99 | 香港aa三级久久三级老师2021国产三级精品三级在 | 色妞色综合久久夜夜| 欧美色综合久久久久久| 久久久久久久久久久免费精品| 久久青草国产手机看片福利盒子| 色欲久久久天天天综合网| 97精品国产97久久久久久免费 | 久久人人爽人人爽人人片AV麻烦 | 久久91精品久久91综合| 国产欧美久久久精品| 精品久久久久中文字| 久久性精品|