亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

進程控制之wait和waitpid函數

2024-06-28 13:28:36
字體:
來源:轉載
供稿:網友
進程控制之wait和waitpid函數

當一個進程正常或異常終止時,內核就向其父進程發送SIGCHLD信號。因為子進程終止是個異步事件(這可以在父進程運行的任何時候發生),所以這種信號也是內核向父進程發的異步通知。父進程可以選擇忽略該信號,或者提供一個該信號發生時即被調用執行的函數(信號處理程序)。對于這種信號的系統默認動作是忽略它)。

調用wait或waitpid的進程可能會發生的情況:

  • 如果其所有子進程都還在運行,則阻塞。
  • 如果一個子進程已終止,正等待父進程獲取其終止狀態,則取得該子進程的終止狀態立即返回。
  • 如果它沒有任何子進程,則立即出錯返回。

如果進程由于接收到SIGCHLD信號而調用wait,則可期望wait會立即返回。但是如果在任意時刻調用wait,則進程可能會阻塞。

#include <sys/wait.h>pid_t wait( int *statloc );返回值:若成功則返回已終止子進程ID,若出錯則返回-1pid_t waitpid( pid_t pid, int *statloc, int options );返回值:若成功則返回狀態改變的子進程ID,若出錯則返回-1,若指定了WNOHANG選項且pid指定的子進程狀態沒有發生改變則返回0

這兩個函數的區別如下:

  • 在一個子進程終止前,wait使其調用者阻塞,而waitpid有一個選項,可使調用者不阻塞。
  • waitpid并不等待在其調用之后的第一個終止子進程,它有若干個選項,可以控制它所等待的進程。

如果一個子進程已經終止,并且是一個僵死進程,則wait立即返回并取得該子進程的狀態,否則wait使其調用者阻塞直到一個子進程終止。如果調用者阻塞而且它有多個子進程,則在其一個子進程終止時,wait就立即返回。因為wait返回終止子進程的進程ID,所以它總能了解是哪一個子進程終止了。

這兩個函數的參數statloc是一個整型指針。如果statloc不是一個空指針,則終止進程的終止狀態就存放在它所指向的單元內。如果不關心終止狀態,則可將該參數指定為空指針。

依據傳統,這兩個函數返回的整型狀態字是由實現定義的。其中某些位表示退出狀態(正常返回),其他位則指示信號編號(異常返回),有一位指示是否產生了一個core文件等。POSIX.1規定狀態用定義在<sys/wait.h>中的各個宏來查看。有四個互斥的宏可用來取得進程終止的原因,它們的名字都以WIF開始?;谶@四個宏中哪一個值為真,就可選用其他宏(表8-1說明欄中下劃線標注的宏)來取得終止狀態、信號編號等。這四個互斥的宏示于表8-1中。

表8-1 檢查wait和waitpid所返回的終止狀態的宏

說明

         WIFEXITED(status)     若為正常終止子進程返回的狀態,則為真。對于這種情況可執行WEXITSTATUS(status),取子進程傳送給exit、_exit或_Exit參數的低8位
         WIFSIGNALED(status)    若為異常終止子進程返回的狀態,則為真(接到一個不捕捉的信號)。對于這種情況,可執行WTERMSIG(status),取使子進程終止的信號編號。另外,有些實現定義宏WCOREDUMP(status),若已產生終止進程的core文件,則它返回真
        WIFSTOPPED(status)    若為當前暫停子進程的返回狀態,則為真。對于這種情況,可執行WSTOPSIG(status),取使子進程暫停的信號編號
        WIFCONTINUED(status)    若在作業控制暫停后已經繼續的子進程返回了狀態,則為真。(POSIX.1的XSI擴展;僅用于waitpid。)

 

程序清單8-3 打印exit狀態的說明

[root@localhost apue]# cat PRog8-3.c#include "apue.h"#include <sys/wait.h>void pr_exit(int status){        if(WIFEXITED(status))                printf("normal termination, exit status = %d/n",                        WEXITSTATUS(status));        else if(WIFSIGNALED(status))                printf("abnormal termination, signal number = %d%s/n",                        WTERMSIG(status),#ifdef  WCOREDUMP                WCOREDUMP(status) ? " (core file generated)" : "");#else                "");#endif        else if(WIFSTOPPED(status))                printf("child stopped, signal number = %d/n",                        WSTOPSIG(status));}

程序清單8-4 演示不同的exit值(調用prog8-3中的pr_exit函數)

[root@localhost apue]# cat prog8-4.c#include "apue.h"#include <sys/wait.h>intmain(void){        pid_t   pid;        int     status;        if ((pid = fork()) < 0)                err_sys("fork error");        else if (pid == 0)                exit(7);                /* child */        if (wait(&status) != pid)       /* wait for child */                err_sys("wait error");        pr_exit(status);                /* and print its status */        if ((pid = fork()) < 0)                err_sys("fork error");        else if (pid == 0)              /* child */                abort();        if (wait(&status) != pid)       /* wait for child */                err_sys("wait error");        pr_exit(status);                /* and print its status */        if ((pid = fork()) < 0)                err_sys("fork error");        else if (pid == 0)              /* child */                status /= 0;            /* divide by 0 generates SIGPE */        if (wait(&status) != pid)       /* wait for child */                err_sys("wait error");        pr_exit(status);                /* and print its status */        exit(0);}

運行該程序可得:

[root@localhost apue]# ./prog8-4normal termination, exit status = 7abnormal termination, signal number = 6abnormal termination, signal number = 8

不幸的是,沒有一種可移植的方法將WTERMSIG得到的信號編號映射為說明性的名字。我們必須查看<signal.h>頭文件才能知道SIGABRT的值是6,SIGFPE的值是8.

正如前面所述,如果一個進程有幾個子進程,那么只要有一個子進程終止,wait就返回。如果要等待一個指定的進程終止(如果知道要等待進程的ID),那么該如何做呢?POSIX.1定義了waitpid函數以提供這種功能(以及其他一些功能)。

對于waitpid函數中pid參數的作用解釋如下:

pid == –1   等待任一子進程。就這一方面而言,waitpid與wait等效。
pid > 0   等待其進程ID與pid相等的子進程。
pid == 0   等待其組ID等于調用進程組ID的任一子進程。
pid < –1   等待其組ID等于pid絕對值的任一子進程。

waitpid函數返回終止子進程的進程ID,并將該子進程的終止狀態存放在由status指向的存儲單元中。對于wait,其唯一的出錯是調用進程沒有子進程(函數調用被一個信號中斷時,也可能返回另一種出錯)。但是對于waitpid,如果指定的進程或進程組不存在,或者參數pid指定的進程不是調用進程的子進程則都將出錯。

options參數使我們能進一步控制waitpid的操作。此參數可以是0,或者是表8-2中常量按位“或”運算的結果。

表8-2 waitpid的options常量

常量

說明

          WCONTINUED   若實現支持作業控制,那么由pid指定的任一子進程在暫停后已經繼續,但其狀態尚未報告,則返回其狀態
          WNOHANG   若由pid指定的子進程并不是立即可用的,則waitpid不阻塞,此時其返回值為0
          WUNTRACED   若某實現支持作業控制,而由pid指定的任一子進程已處于暫停狀態,并且其狀態自暫停以來還未報告過,則返回其狀態。WIFSTOPPED宏確定返回值是否對應于一個暫停子進程

 

waitpid函數提供了wait函數沒有提供的三個功能:

(1)waitpid可等待一個特定的進程,而wait則返回任一終止子進程的狀態。

(2)waitpid提供了一個wait的非阻塞版本。有時用戶希望取得一個子進程的狀態,但不想阻塞。

(3)waitpid支持作業控制(利用WUNTRACED和WCONTINUED選項)。

如果一個進程fork一個子進程,但不要等待子進程終止,也不希望子進程處于僵死狀態直到父進程終止,實現這一要求的技巧是調用fork兩次。

程序清單8-5 調用fork兩次以避免僵死進程

[root@localhost apue]# cat prog8-5.c#include "apue.h"#include <sys/wait.h>intmain(void){        pid_t pid;        if ((pid = fork()) < 0)        {                err_sys("fork error");        }        else if (pid == 0)              /* first child */        {                if ((pid = fork()) < 0)                        err_sys("fork error");                else if (pid > 0)                        exit(0);        /* parent from second fork == first child */                /*                * We're the second child; our parent become init as soon                * as our real parent calls exit() in the statement above.                * Here's where we'd continue executing, knowing that when                 * we're done, init will reap our status.                */                sleep(2);                printf("second child, parent pid = %d/n", getppid());                exit(0);        }        if (waitpid(pid, NULL, 0) != pid)       /* wait for first child */                err_sys("waitpid error");        /*        * We're the parent ( the original process ); we continue executing,        * knowing that we're not the parent of the second child.         */        exit(0);}

第二個子進程調用sleep以保證在打印父進程ID時第一個子進程已終止。在fork之后,父、子進程都可繼續執行,并且我們無法預知哪一個會先執行。在fork之后,如果不使第二個子進程休眠,那么它可能比其父進程先執行,于是它打印的父進程ID將是創建它的父進程,而不是init進程(進程ID 1)。

執行結果:

[root@localhost apue]# ./prog8-5[root@localhost apue]# second child, parent pid = 1

注意,當原先的進程(也就是exec本程序的進程)終止時,shell打印其提示符,這在第二個子進程打印其父進程ID之前。

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲一级高清| 久国内精品在线| 国产精品高潮在线| 欧美一级电影久久| 日韩在线欧美在线国产在线| 国产xxx69麻豆国语对白| 国产精品日韩专区| 国产成人久久精品| x99av成人免费| 国产精品高潮呻吟视频| 欧美日韩免费一区| 茄子视频成人在线| 亚洲一区二区三区成人在线视频精品| 91国自产精品中文字幕亚洲| 91精品视频网站| 色av中文字幕一区| 91视频国产一区| 91影视免费在线观看| 亚洲色无码播放| 欧美精品久久久久久久免费观看| 久久精视频免费在线久久完整在线看| 欧美性xxxxx极品| 92福利视频午夜1000合集在线观看| 97国产真实伦对白精彩视频8| 国产精品成人av性教育| 久久视频国产精品免费视频在线| 波霸ol色综合久久| 国产亚洲精品久久久久动| 日本久久久久久久久| 欧美超级免费视 在线| 韩国19禁主播vip福利视频| 欧美另类高清videos| 5566成人精品视频免费| 亚洲精品久久久久中文字幕欢迎你| www.精品av.com| 亚洲午夜精品久久久久久性色| 日韩欧美在线播放| 欧美日韩国产一区二区三区| 久久亚洲精品中文字幕冲田杏梨| 尤物tv国产一区| 欧美激情18p| 成人欧美一区二区三区黑人| 国产亚洲一级高清| 国产精品电影网| 国产成人激情小视频| 日韩欧亚中文在线| 欧美性20hd另类| 欧美成aaa人片在线观看蜜臀| 少妇高潮久久久久久潘金莲| 国产成人自拍视频在线观看| 亚洲a∨日韩av高清在线观看| 国产做受高潮69| 亚洲欧美在线看| 91精品免费看| 国产综合久久久久久| 在线免费看av不卡| 久久国产精品久久久久久| 91日韩在线播放| 欧美国产极速在线| 91精品国产99久久久久久| 欧美激情视频在线观看| 色综合天天综合网国产成人网| 日韩在线视频线视频免费网站| 亚洲精品自在久久| 久久夜色精品亚洲噜噜国产mv| 国产精品精品视频| 97精品国产91久久久久久| 日韩中文字幕在线| 久久久国产一区二区| 综合欧美国产视频二区| 国产精品ⅴa在线观看h| 亚洲最新av网址| 在线色欧美三级视频| 97视频在线观看免费| 欧美性视频精品| 亚洲第一区中文字幕| 日韩视频在线免费观看| 日韩最新在线视频| 日本在线精品视频| 亚洲新中文字幕| 一本色道久久88精品综合| 少妇av一区二区三区| 黑人巨大精品欧美一区二区一视频| 亚洲香蕉成人av网站在线观看| 国产日韩中文在线| 亚洲v日韩v综合v精品v| 国内精品小视频| 九九热这里只有在线精品视| 91精品在线一区| 亚洲r级在线观看| 亚洲国产欧美精品| 国产精品久久久久久网站| 草民午夜欧美限制a级福利片| 亚洲国产欧美一区二区三区久久| 欧美成人免费视频| 亚洲午夜精品久久久久久久久久久久| 亚洲v日韩v综合v精品v| 91黑丝高跟在线| 国产精品一区二区av影院萌芽| 欧美一级免费视频| 国产亚洲一区二区精品| 色狠狠久久aa北条麻妃| 亚洲黄色www网站| 韩国三级日本三级少妇99| 日韩av一区在线观看| 国产精品第10页| 91精品成人久久| 成人a免费视频| 亚洲欧洲在线免费| 国产精品91久久久久久| 岛国精品视频在线播放| 国产欧美婷婷中文| 性色av香蕉一区二区| 成人激情综合网| 久久中文字幕一区| 亚洲精品720p| 国产精品吴梦梦| 欧美怡红院视频一区二区三区| 精品国产自在精品国产浪潮| 午夜精品久久久久久久久久久久| 久久精品男人天堂| 欧美激情中文字幕在线| 91超碰中文字幕久久精品| 性色av香蕉一区二区| 亚洲自拍偷拍一区| 日韩av网站导航| 成人激情av在线| 97超级碰在线看视频免费在线看| 97视频在线看| 亚洲男人天堂网| 性色av一区二区三区| 成人黄色免费在线观看| 国产精品999999| 最近2019中文字幕一页二页| 国内精品国产三级国产在线专| 91精品国产91久久久久久不卡| 97国产真实伦对白精彩视频8| 高清日韩电视剧大全免费播放在线观看| 欧美一级片免费在线| 日韩av一区在线| 国产成人精品免高潮费视频| 国产一区二区三区精品久久久| 国产xxx69麻豆国语对白| 免费不卡欧美自拍视频| 国产精品视频免费观看www| 国产精品久久久久久久久久免费| 欧美性xxxxx极品娇小| 国产精品视频999| 精品视频久久久久久| 91国产中文字幕| 久久99久国产精品黄毛片入口| 97国产精品久久| 久久久久久国产精品三级玉女聊斋| 亚洲人成伊人成综合网久久久| 欧美午夜丰满在线18影院| 国产精品观看在线亚洲人成网| 欧美视频在线免费看| 精品一区二区电影| 国产亚洲欧洲在线| 国产成人精品日本亚洲| 中文字幕欧美精品在线| 午夜精品福利电影| 欧美激情一级二级| 国产精品精品视频一区二区三区|