色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看


wait()和waitpid()函數

分享到:
           

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

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

    waitpid()的作用和wait()一樣,但它并不一定要等待第一個終止的子進程,它還有若干選項,如可提供一個非阻塞版本的wait()功能,也能支持作業控制。實際上,wait()函數只是waitpid()函數的一個特例,在Linux內部實現wait()函數時直接調用的就是waitpid()函數。

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

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

表1 wait()函數語法要點

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

    表2列出了waitpid()函數的語法要點。

表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()函數的使用較為簡單,在此僅以waitpid()為例進行講解。本例中首先使用fork()創建一個子進程,然后讓其子進程暫停5s(使用了sleep()函數)。接下來對原有的父進程使用waitpid()函數,并使用參數WNOHANG使該父進程不會阻塞。若有子進程退出,則waitpid()返回子進程號;若沒有子進程退出,則waitpid()返回0,并且父進程每隔1s循環判斷一次。該程序的流程圖如圖1所示。


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

    該程序源代碼如下:

    /* 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");
            }
        }
    }

    將該程序交叉編譯,下載到目標板后的運行結果如下:

    $ ./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

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

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

    $ ./waitpid
    Get child exit code: 76

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

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

   熱點鏈接:

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

更多新聞>> 

主站蜘蛛池模板: 亚洲精品无码AV天堂 | 国产欧美在线观看视频 | 98视频精品全部国产 | 玩偶姐姐免费观看 | 18以下勿进色禁网站免费看 | 国产麻豆老师在线观看 | 亚洲国产成人精品无码区在线秒播 | 蜜桃精品视频在线 | 天堂网中文字幕在线观看 | 18禁无遮拦无码国产在线播放 | 国产女主播喷水视频在线观看 | 亚洲专区欧美专区 | 欧美老妇激情BBBWWBBW | 在线综合亚洲欧美网站 | 无码中文字幕人妻在线一区二区三区 | 在线国产欧美 | 日本三级免费看 | 国产老妇伦国产熟女老妇高清 | 亚洲AV无码欧洲AV无码网站 | 人妻慢慢放弃抵抗开始迎合 | 亚洲日本香蕉视频观看视频 | 欧美三级韩国三级日本三斤 | 亚洲不卡av一区二区三区 | 2018天天拍拍天天爽视频 | 国产精品色情国产三级在 | 激情97综合亚洲色婷婷五 | "a级毛片 黄" | 99视频有精品视频 | 综合一区av | 免费观看老外一级毛片视频 | 中文字幕久久熟女人妻av免费 | 麻豆国产hdxxxxvideo | 欧美最猛性XXXXX潮喷 | 国产精品扒开腿做爽爽爽A片小 | 最新国产乱人伦偷精品免费网站 | 天天爱天天做天天爽夜夜揉 | 亚洲日韩欧洲无码AV夜夜摸 | 久久久久青草线综合超碰 | 日本人与黑人做爰视频网站 | 无码人妻丰满熟妇区BBBBXXXX | 美女胸18大禁视频网站 |