隨筆-204  評(píng)論-149  文章-0  trackbacks-0
          waitpid(等待子進(jìn)程中斷或結(jié)束)
            表頭文件
            #include<sys/types.h>
            #include<sys/wait.h>
            定義函數(shù) pid_t waitpid(pid_t pid,int * status,int options);
            函數(shù)說(shuō)明
            waitpid()會(huì)暫時(shí)停止目前進(jìn)程的執(zhí)行,直到有信號(hào)來(lái)到或子進(jìn)程
            結(jié)束。如果在調(diào)用 wait()時(shí)子進(jìn)程已經(jīng)結(jié)束,則 wait()會(huì)立即
            返回子進(jìn)程結(jié)束狀態(tài)值。 子進(jìn)程的結(jié)束狀態(tài)值會(huì)由參數(shù) status 返回,
            而子進(jìn)程的進(jìn)程識(shí)別碼也會(huì)一起返回。如果不在意結(jié)束狀態(tài)值,則
            參數(shù) status 可以設(shè)成 NULL。參數(shù) pid 為欲等待的子進(jìn)程識(shí)別碼,
            其他數(shù)值意義如下:
            pid<-1 等待進(jìn)程組識(shí)別碼為 pid 絕對(duì)值的任何子進(jìn)程。
            pid=-1 等待任何子進(jìn)程,相當(dāng)于 wait()。
            pid=0 等待進(jìn)程組識(shí)別碼與目前進(jìn)程相同的任何子進(jìn)程。
            pid>0 等待任何子進(jìn)程識(shí)別碼為 pid 的子進(jìn)程。
            參數(shù) option 可以為 0 或下面的 OR 組合:
            WNOHANG 如果沒(méi)有任何已經(jīng)結(jié)束的子進(jìn)程則馬上返回, 不予以等待。
            WUNTRACED 如果子進(jìn)程進(jìn)入暫停執(zhí)行情況則馬上返回,但結(jié)束狀態(tài)不予以理會(huì)。
            子進(jìn)程的結(jié)束狀態(tài)返回后存于 status,底下有幾個(gè)宏可判別結(jié)束情況:
            WIFEXITED(status)如果子進(jìn)程正常結(jié)束則為非 0 值。
            WEXITSTATUS(status)取得子進(jìn)程 exit()返回的結(jié)束代碼,一般會(huì)先用 WIFEXITED 來(lái)判斷是否正常結(jié)束才能使用此宏。
            WIFSIGNALED(status)如果子進(jìn)程是因?yàn)樾盘?hào)而結(jié)束則此宏值為真
            WTERMSIG(status) 取得子進(jìn)程因信號(hào)而中止的信號(hào)代碼,一般會(huì)先用 WIFSIGNALED 來(lái)判斷后才使用此宏。
            WIFSTOPPED(status) 如果子進(jìn)程處于暫停執(zhí)行情況則此宏值為真。一般只有使用 WUNTRACED 時(shí)才會(huì)有此情況。
            WSTOPSIG(status) 取得引發(fā)子進(jìn)程暫停的信號(hào)代碼,一般會(huì)先用 WIFSTOPPED 來(lái)判斷后才使用此宏。
            如果執(zhí)行成功則返回子進(jìn)程識(shí)別碼(PID) ,如果有錯(cuò)誤發(fā)生則返回
            返回值-1。失敗原因存于 errno 中。
            /******
            * waitpid.c - Simple wait usage
            *********/
            #include <unistd.h>
            #include <sys/types.h>
            #include <sys/wait.h>
            #include <stdio.h>
            #include <stdlib.h>
            int main( void )
            {
            pid_t childpid;
            int status;
            childpid = fork();
            if ( -1 == childpid )
            {
            perror( "fork()" );
            exit( EXIT_FAILURE );
            }
            else if ( 0 == childpid )
            {
            puts( "In child process" );
            sleep( 3 );//讓子進(jìn)程睡眠3秒,看看父進(jìn)程的行為
            printf("\tchild pid = %d\n", getpid());
            printf("\tchild ppid = %d\n", getppid());
            exit(EXIT_SUCCESS);
            }
            else
            {
            waitpid( childpid, &status, 0 );
            puts( "in parent" );
            printf( "\tparent pid = %d\n", getpid() );
            printf( "\tparent ppid = %d\n", getppid() );
            printf( "\tchild process exited with status %d \n", status );
            }
            exit(EXIT_SUCCESS);
            }
            [root@localhost src]# gcc waitpid.c
            [root@localhost src]# ./a.out
            In child process
            child pid = 4469
            child ppid = 4468
            in parent
            parent pid = 4468
            parent ppid = 4379
            child process exited with status 0
            [root@localhost src]#
            如果將上面“waitpid( childpid, &status, 0 );”行注釋掉,程序執(zhí)行效果如下:
            [root@localhost src]# ./a.out
            In child process
            in parent
            parent pid = 4481
            parent ppid = 4379
            child process exited with status 1331234400
            [root@localhost src]# child pid = 4482
            child ppid = 1
            子進(jìn)程還沒(méi)有退出,父進(jìn)程已經(jīng)退出了。
          posted on 2009-07-05 00:01 Frank_Fang 閱讀(442) 評(píng)論(0)  編輯  收藏 所屬分類: Linux | ACE網(wǎng)絡(luò)編程
          主站蜘蛛池模板: 木兰县| 丰顺县| 友谊县| 上饶县| 景东| 新巴尔虎左旗| 德庆县| 凤冈县| 荔浦县| 达州市| 驻马店市| 黎平县| 巫山县| 眉山市| 株洲县| 宿州市| 阿尔山市| 盐池县| 当阳市| 辛集市| 隆回县| 河西区| 长泰县| 吉木乃县| 方正县| 泉州市| 浪卡子县| 屏东市| 大田县| 宝山区| 梧州市| 茶陵县| 德阳市| 那坡县| 渭源县| 安岳县| 连平县| 凤台县| 商都县| 韩城市| 玉山县|