IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_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下多任務系統之線程介紹

更多新聞>> 

主站蜘蛛池模板: 扭力扳手_扭力扳手检定仪_数显扭力扳手_扭力测试仪_测力计_推拉力计_拉力测试仪_测试台架-上海实干实业有限公司 | 山东恒泰矿业设备有限公司_跑车防护装置,矿用电机车,防爆无轨胶轮车,耙斗装岩机 | 金属网帘|金属帘|装饰网帘|金属环网|金属幕墙网|金属垂帘|金属扣帘-安平县名图金属丝网制品有限公司 | 上海海外置业展_2024海外置业移民留学展_4月5-7日_企业参展处/免费领门票 | 无锡防爆墙-无锡泄爆墙_江苏鑫立轩装饰工程有限公司 | 欧派板材官网 | 全屋定制板材 专业供应商 | 远红外桑拿房-江苏侨达健康科技有限公司| 弯箍机_钢筋弯箍机_全自动钢筋弯箍机_数控弯箍机-建科智能装备制造(天津)股份有限公司 | 银联POS机_银联微信支付宝刷卡POS机_外币POS机_移动POS机办理安装——谷骐科技 | 湖南众一离心机股份有限公司_活塞推料离心机_沉降离心机_卧式刮刀离心机 | 全自动高速点胶机,锡膏喷印机系列,点胶阀核心配件厂家-博宁 | 射频微波_微波元器件_芯片_电源模块_Raychem_立维创展 | 河南电梯公司_郑州电梯公司_河南家用别墅电梯厂家-郑州嘉祥机电设备公司 | 绍兴凯渥人力资源有限公司-劳务派遣,劳务分包,代办公司注册 | 淄博润裕机械设备有限公司-搅拌器,搅拌桨叶,反应釜,机械密封,化工搅拌 | 山东洗地机_工业洗地机_驾驶式扫地机_扫地车厂家_鼎洁盛世官网 | 金坛区成辉仪器厂-精密増力电动搅拌器,石英亚沸蒸馏水器- | 生活污水处理设备-地埋式污水处理设备厂家-山东梦之洁水处理设备有限公司 | 停车场收费管理系统,通道闸系统,门禁系统,东莞停车场收费管理系统,东莞通道闸系统,-东莞市骄阳交通设备有限公司 | 太阳能路灯-高杆灯-景观灯-玉兰灯-中华灯-LED市电-庭院灯厂家-扬州汉威光电科技有限公司 | 家用油烟净化机_商用餐饮油烟净化器_工业油雾废气处理设备_深圳市宝篮环保 | 汽车标签|医疗标签|电子标签|手机电池标签|电脑电池标签|电源标签|耐高温标签|防静电标签|手机出厂膜|手机全裹膜|手机包裹膜|手机卖点膜|热转印标签|遮阳板标签|天势科技|-标签印制专家! | 铝合金锻造|链轮曲柄-同力铝业股份有限公司| 郑州长城冶金设备有限公司| 交通标志牌-交通标牌-铝圆牌-铝三角片-铝滑槽-公路警示指示牌-方牌-高速道路反光牌毛坯-交通设施安全警示标识牌-路名指示限速限高牌-厂家加工交通标牌铝板半成品毛坯-上海吕盟铝业有限公司 | 数控钢筋弯箍机_数控钢筋弯曲中心_数控钢筋笼滚焊机厂家_山东佳信 | 宁波雷豹机电科技有限公司|雷豹冷风机|雷豹工业大风扇|MFC18000|MFC16000|MFC6000|EF3622|EF4222|EF4822|移动工业蒸发式冷风机空气冷却器|大型工业空调扇|雷豹移动式工业大风扇|雷豹大风扇|生产厂家|公司官网 | 木材粉碎机,木头木材破碎机,大型木材粉碎机多少钱一台-晨红木材粉碎机厂家-巩义市晨红机械厂 | 宜昌江峡船用机械有限责任公司欢迎您! | 耐压测试仪(检测电气设备绝缘性能)百科| 移动厕所_真空环保厕所_环保厕所_景区生态厕所_雨施捷移动厕所生产厂家 | 温州方圆仪器有限公司 工业自动化|自动化设备 - 温州方圆仪器有限公司 | 山西华盛筑景装饰,山西专业公装公司,太原公装装修公司,包括:办公室,酒店宾馆,商铺店铺,学校幼儿园,会所会馆饭店餐馆等装修设计 | 优质课网_收录全国及各省市最新优质课视频,说课视频,名师课例课堂实录,高效课堂教学视频,观摩展示公开示范优秀课视频,教学大赛视频! | 河南反渗透设备-河南EDI超纯水设备-郑州纯净水设备-郑州友邦水处理设备有限公司 | 首页 网络安全与数据治理(原《信息技术与网络安全》) | 专注客流统计,客流分析,人流统计系统,客流计数器-广州市天威电子科技有限公司 | 上海便携式液体_日本理音液体_HACH液体颗粒计数器,metone尘埃粒子计数器-上海翰森科学仪器有限公司 | 桁架楼承板_钢筋桁架楼承板厂家-山东新材料科技 | 宣传片拍摄-宣传片制作-三维动画-企业视频广告报价-北京环宇影音 | 郑州腾飞建设工程集团有限公司|