久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久


wait()和waitpid()函數

分(fen)享(xiang)到:
           

    1)wait()和waitpid()函數說明

    wait()函數用于使(shi)父進(jin)程(cheng)(cheng)(cheng)(也就是調用wait()的(de)進(jin)程(cheng)(cheng)(cheng))阻塞,直到(dao)一(yi)個子進(jin)程(cheng)(cheng)(cheng)結束(shu)或者該進(jin)程(cheng)(cheng)(cheng)接收到(dao)了一(yi)個指定(ding)的(de)信號為止。如果該父進(jin)程(cheng)(cheng)(cheng)沒有(you)子進(jin)程(cheng)(cheng)(cheng)或者它的(de)子進(jin)程(cheng)(cheng)(cheng)已經結束(shu),則wait()就會立即(ji)返(fan)回。

    waitpid()的(de)(de)(de)作用和(he)wait()一(yi)(yi)(yi)樣,但它(ta)并不一(yi)(yi)(yi)定要等(deng)待第(di)一(yi)(yi)(yi)個(ge)終止的(de)(de)(de)子進程,它(ta)還有若干選項,如可(ke)提供(gong)一(yi)(yi)(yi)個(ge)非阻塞版本(ben)的(de)(de)(de)wait()功能(neng),也能(neng)支持(chi)作業(ye)控制。實際上,wait()函(han)數只是waitpid()函(han)數的(de)(de)(de)一(yi)(yi)(yi)個(ge)特例(li),在Linux內部實現wait()函(han)數時(shi)直(zhi)接調(diao)用的(de)(de)(de)就(jiu)是waitpid()函(han)數。

    2)wait()和waitpid()函數格式說明

    表(biao)1列出了wait()函(han)數的語法要點。

表1 wait()函數語法(fa)要點

所需頭文件 #include <sys/types.h>
#include <sys/wait.h>
函數原型 pid_t wait(int *status)
函數傳入值 這里的status是一個整型指針,是該子進程退出時的狀態。若status不為空,則通過它可以獲得子進程的結束狀態。另外,子進程的結束狀態可由Linux中一些特定的宏來測定
函數返回值 成功:已結束運行的子進程的進程號
失敗:-1

&nbsp;   表2列(lie)出(chu)了waitpid()函(han)數的(de)語法要點(dian)。

表(biao)2 waitpid()函數語法要點

所需頭文件 #include <sys/types.h>
#include <sys/wait.h>
函數原型 pid_t waitpid(pid_t pid, int *status, int options)
函數傳入值 pid pid > 0:只等待進程ID等于pid的子進程,不管是否已經有其他子進程運行結束退出,只要指定的子進程還沒有結束,waitpid()就會一直等下去
pid = -1:等待任何一個子進程退出,此時和wait()作用一樣
pid = 0:等待其組ID等于調用進程的組ID的任一子進程
pid < -1:等待其組ID等于pid的絕對值的任一子進程
status 同wait()
options WNOHANG:若由pid指定的子進程沒有結束,則waitpid()不阻塞而立即返回,此時返回值為0
WUNTRACED:為了實現某種操作,由pid指定的任一子進程已被暫停,且其狀態自暫停以來還未報告過,則返回其狀態
0:同wait(),阻塞父進程,等待子進程退出
函數返回值 正常:已經結束運行的子進程的進程號
使用選項WNOHANG且沒有子進程退出:0
調用出錯:-1

    3)waitpid()使用實例

    由于wait()函數的(de)使(shi)(shi)(shi)用(yong)較(jiao)為(wei)簡單,在此僅以waitpid()為(wei)例(li)進(jin)行講解。本例(li)中(zhong)首先使(shi)(shi)(shi)用(yong)fork()創(chuang)建一(yi)個子進(jin)程(cheng)(cheng),然后讓其子進(jin)程(cheng)(cheng)暫(zan)停5s(使(shi)(shi)(shi)用(yong)了sleep()函數)。接下來(lai)對原有的(de)父(fu)(fu)進(jin)程(cheng)(cheng)使(shi)(shi)(shi)用(yong)waitpid()函數,并使(shi)(shi)(shi)用(yong)參數WNOHANG使(shi)(shi)(shi)該(gai)父(fu)(fu)進(jin)程(cheng)(cheng)不會阻塞。若有子進(jin)程(cheng)(cheng)退出(chu),則(ze)waitpid()返回子進(jin)程(cheng)(cheng)號(hao);若沒有子進(jin)程(cheng)(cheng)退出(chu),則(ze)waitpid()返回0,并且父(fu)(fu)進(jin)程(cheng)(cheng)每隔1s循環判斷一(yi)次(ci)。該(gai)程(cheng)(cheng)序的(de)流程(cheng)(cheng)圖(tu)如圖(tu)1所示。


圖(tu)1 waitpid()函數程序流程圖(tu)

    該程序源代(dai)碼如下:

    /* waitpid.c */
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
        pid_t pc, pr;

        pc = fork();
        if (pc < 0)
        {
            printf("Error fork\n");
        }
        else if (pc == 0) /* 子進程 */
        {
            /* 子進程暫停5s */
            sleep(5);
            /* 子進程正常退出 */
            exit(0);
        }
        else /* 父進程 */
        {
            /* 循環測試子進程是否退出 */
            do
            {
                /* 調用waitpid(),且父進程不阻塞 */
                pr = waitpid(pc, NULL, WNOHANG);

                /* 若子進程還未退出,則父進程暫停1s */
                if (pr == 0)
                {
                    printf("The child process has not exited\n");
                    sleep(1);
                }
            } while (pr == 0);

            /* 若發現子進程退出,打印出相應情況 */
            if (pr == pc)
            {
                printf("Get child exit code: %d\n",pr);
            }
            else
            {
                printf("Some error occured.\n");
            }
        }
    }

    將該程(cheng)序交(jiao)叉編譯(yi),下載到目標板后的運行結果(guo)如(ru)下:

    $ ./waitpid
    The child process has not exited
    The child process has not exited
    The child process has not exited
    The child process has not exited
    The child process has not exited
    Get child exit code: 75

    可(ke)見,該(gai)程序在經過5次循環(huan)后,捕獲(huo)到了(le)子進程的退(tui)出信(xin)號,具體的子進程號在不同的系統上會有所區別。

    讀(du)者(zhe)還可以嘗試(shi)把“pr = waitpid(pc, NULL, WNOHANG);”改為(wei)“pr = waitpid(pc, NULL, 0);”或者(zhe)“pr = wait(NULL);”,運行的(de)結果為(wei):

    $ ./waitpid
 &nbsp; &nbsp;Get child exit code: 76

    可(ke)見,在上(shang)述兩(liang)種情況下,父進程在調(diao)用waitpid()或wait()之后(hou)就將自(zi)己阻塞,直(zhi)到有(you)子進程退出為止。

    本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》

   熱點鏈接(jie):

   1、exit()和_exit()函數
   2、Linux下多進程編程之exec函數語法及使用實例
   3、Linux下多進程編程之fork()函數語法
   4、Linux下多進程編程之fork()函數說明
   5、Linux下多任務系統之線程介紹

更多新聞>>