IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育


實(shí)驗(yàn):編寫(xiě)多進(jìn)程程序

分享到:
           

    1.實(shí)驗(yàn)?zāi)康?/strong>

    通過(guò)編寫(xiě)多進(jìn)程程序,使讀者熟練掌握fork()exec()wait()waitpid()等函數(shù)的使用,進(jìn)一步理解在Linux中多進(jìn)程編程的步驟。

    2.實(shí)驗(yàn)內(nèi)容

    該實(shí)驗(yàn)有3個(gè)進(jìn)程,其中一個(gè)為父進(jìn)程,其余兩個(gè)是該父進(jìn)程創(chuàng)建的子進(jìn)程,其中一個(gè)子進(jìn)程運(yùn)行“l(fā)s -l”指令,另一個(gè)子進(jìn)程在暫停5s后異常退出。父進(jìn)程先用阻塞方式等待第一個(gè)子進(jìn)程的結(jié)束,然后用非阻塞方式等待另一個(gè)子進(jìn)程的退出,待收集到第二個(gè)子進(jìn)程結(jié)束的信息后,父進(jìn)程就返回。

    3.實(shí)驗(yàn)步驟

    (1)畫(huà)出該實(shí)驗(yàn)流程圖。該實(shí)驗(yàn)流程圖如圖1所示。


圖1 實(shí)驗(yàn)流程圖

    (2)實(shí)驗(yàn)源代碼。先看一下下面的代碼,這個(gè)程序能得到我們所希望的結(jié)果嗎?它的運(yùn)行會(huì)產(chǎn)生幾個(gè)進(jìn)程?請(qǐng)讀者回憶一下fork()調(diào)用的具體過(guò)程。

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

    int main(void)
    {
        pid_t child1, child2, child;
        /* 創(chuàng)建兩個(gè)子進(jìn)程 */
        child1 = fork();
        child2 = fork();
        /* 子進(jìn)程1的出錯(cuò)處理 */
        if (child1 == -1)
        {
            printf("Child1 fork error\n");
            exit(1);
        }
        /* 在子進(jìn)程1中調(diào)用execlp()函數(shù) */
        else if (child1 == 0)
        {
            printf("In child1: execute 'ls -l'\n");
            if (execlp("ls", "ls", "-l", NULL) < 0)
            {
                printf("Child1 execlp error\n");
            }
        }

        /* 子進(jìn)程2的出錯(cuò)處理 */
        if (child2 == -1)
        {
            printf("Child2 fork error\n");
            exit(1);
        }
        /* 在子進(jìn)程2中使其暫停5s */
        else if( child2 == 0 )
        {
            printf("In child2: sleep for 5 seconds and then exit\n");
            sleep(5);
            exit(0);
        }
        /* 在父進(jìn)程中等待兩個(gè)子進(jìn)程的退出 */
        else
        {
            printf("In father process:\n");
            child = waitpid(child1, NULL, 0); /* 阻塞式等待 */
            if (child == child1)
            {
                printf("Get child1 exit code\n");
            }
            else
            {
                printf("Error occured!\n");
            }

            do
            {
                child = waitpid(child2, NULL, WNOHANG);/* 非阻塞式等待 */
                if (child == 0)
                {
                    printf("The child2 process has not exited!\n");
                    sleep(1);
                }
            } while (child == 0);

            if (child == child2)
            {
                printf("Get child2 exit code\n");
            }
            else
            {
                printf("Error occured!\n");
            }
        }
        exit(0);
    }

    編譯和運(yùn)行以上代碼,并觀察其運(yùn)行結(jié)果。它的結(jié)果是我們所希望得到的嗎?

    看完前面的代碼后,再觀察下面的代碼,比較一下它們之間有什么區(qū)別,看看會(huì)解決哪些問(wèn)題。

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

    int main(void)
    {
        pid_t child1, child2, child;

        /* 創(chuàng)建兩個(gè)子進(jìn)程 */
        child1 = fork();
        /* 子進(jìn)程1的出錯(cuò)處理 */
        if (child1 == -1)
        {
            printf("Child1 fork error\n");
            exit(1);
        }
        /* 在子進(jìn)程1中調(diào)用execlp()函數(shù) */
        else if (child1 == 0)
        {
            printf("In child1: execute 'ls -l'\n");
            if (execlp("ls", "ls", "-l", NULL) < 0)
            {
                printf("Child1 execlp error\n");
            }
        }
        /* 在父進(jìn)程中再創(chuàng)建進(jìn)程2,然后等待兩個(gè)子進(jìn)程的退出 */
        else
        {
            child2 = fork();
            /* 子進(jìn)程2的出錯(cuò)處理 */
            if (child2 == -1)
            {
                printf("Child2 fork error\n");
                exit(1);
            }
            /* 在子進(jìn)程2中使其暫停5s */
            else if(child2 == 0)
            {
                printf("In child2: sleep for 5 seconds and then exit\n");
                sleep(5);
                exit(0);
            }

            printf("In father process:\n");
            …(以下部分與前面程序的父進(jìn)程執(zhí)行部分相同)
        }
        exit(0);
    }

    (3)首先在宿主機(jī)上編譯、調(diào)試該程序:

    $ gcc multi_proc.c –o multi_proc(或者使用Makefile)

    (4)在確保沒(méi)有編譯錯(cuò)誤后,使用交叉編譯該程序:

    $ arm-linux-gcc multi_proc.c –o multi_proc (或者使用Makefile)

    (5)將生成的可執(zhí)行程序下載到目標(biāo)板上運(yùn)行。

    4.實(shí)驗(yàn)結(jié)果

    在目標(biāo)板上運(yùn)行的結(jié)果如下(具體內(nèi)容與各自的系統(tǒng)有關(guān)):

    $ ./multi_proc
    In child1: execute 'ls -l' /* 子進(jìn)程1的顯示, 以下是“l(fā)s –l”的運(yùn)行結(jié)果 */
    total 28
    -rwxr-xr-x 1 david root 232 2008-07-18 04:18 Makefile
    -rwxr-xr-x 1 david root 8768 2008-07-20 19:51 multi_proc
    -rw-r--r-- 1 david root 1479 2008-07-20 19:51 multi_proc.c
    -rw-r--r-- 1 david root 3428 2008-07-20 19:51 multi_proc.o
    -rw-r--r-- 1 david root 1463 2008-07-20 18:55 multi_proc_wrong.c
    In child2: sleep for 5 seconds and then exit /* 子進(jìn)程2的顯示 */
    In father process: /* 以下是父進(jìn)程顯示 */
    Get child1 exit code /* 表示子進(jìn)程1結(jié)束(阻塞等待) */
    The child2 process has not exited! /* 等待子進(jìn)程2結(jié)束(非阻塞等待) */
    The child2 process has not exited!
    The child2 process has not exited!
    The child2 process has not exited!
    The child2 process has not exited!
    Get child2 exit code /* 表示子進(jìn)程2終于結(jié)束了*/

    本文選自華清遠(yuǎn)見(jiàn)嵌入式培訓(xùn)教材《從實(shí)踐中學(xué)嵌入式Linux應(yīng)用程序開(kāi)發(fā)》

   熱點(diǎn)鏈接:

   1、Linux下多進(jìn)程編程之exec函數(shù)語(yǔ)法及使用實(shí)例
   2、Linux下多進(jìn)程編程之fork()函數(shù)語(yǔ)法
   3、Linux下多進(jìn)程編程之fork()函數(shù)說(shuō)明
   4、Linux守護(hù)進(jìn)程
   5、wait()和waitpid()函數(shù)

更多新聞>> 

主站蜘蛛池模板: 仪器校准-计量检测-计量校准-中健计量检测(广东)有限公司 | 阻抗分析仪 阻抗测试仪 介电常数测试仪 充电枪测试仪-苏州腾斯凯电子科技有限公司 | 营销型网站建设_网站设计_网页制作_找北京恒基建网站公司 | 亚澳农机-亚澳南阳农机股份公司,旋耕机,旋播机,旋播施肥机,免耕播种机,旋耕播草多用机,果园机械-首页 | 江苏保捷锻压有限公司(中国汽车零部件供应商,锻造,精加工,热处理) | 形创(CREAFORM)3D扫描仪|三维检测|三维数字化处理|3D设备租赁|3D打印|——北京中显恒业仪器仪表有限公司 | 石家庄启恒企业管理咨询有限公司 | 西安测试仪-西安电压测试仪-西安电流测试仪-西安热油汽水测试仪-西安阻抗测试仪-西安时间速度测试仪-西安电力设备厂家-西安中洲电力设备有限公司 | 仪器校准,校验,校正,检定选值得托付的第三方法定计量检测机构! 铱金供应-上海钌合金-氯铱酸厂家-上海庞势新材料科技有限公司 | 深圳店铺装修-连锁店装修-深圳标榜装饰设计 | 深圳市新纶超净科技有限公司,防静电/洁净室行业系统解决方案提供商 | 合肥年会策划-合肥开业庆典公司-合肥会务活动礼仪公司-合肥展台搭建/音响租赁公司 [七色海] | 太原重卡叔叔运输有限公司-山西太原大件运输、太原物流公司、太原货运物流、太原大件运输、太原货运信息、长治物流公司、长治大件运输、晋城物流公司、晋城大件运输、忻州大件运输、朔州大件运输、阳泉大件运输、大同大件运输、吕梁大件运输、临汾大件运输、运城大件运城 | 吸气式感烟火灾探测器|极早期烟雾系统|空气采样报警|拓普兰 | 微孔板恒温振荡器-超声波探伤试块-微孔板迷你离心机-南京互川电子有限公司 | 太原门禁系统_太原车牌识别_山西人脸识别系统-山西元一智能科技有限公司 | 行情网 - 钢材行情,金属行情,废金属行情,农产品行情,化工行情,水泥行情 | 装盒机|全自动封盒机|纸盒子包装机|高速装盒机定制-温州胜泰机械有限公司 | 徐州恒铭机械设备有限公司_装载机配件_压路机配件_起重机配件_挖掘机配件_配件_徐州恒铭机械设备有限公司 | 天木生物科技有限公司-高通量自动化-细胞筛选平台 | 汽车配件加工生产模具-手板样品模型厂家-拓维模型 | 泥浆振动筛|卧式泥浆搅拌器|泥浆离心机|泥浆处理固控设备_沧州宏宇石油机械有限公司 | 妙手官网—商品管理、批量修改、订单处理、营销水印 | 盐城市城镇化建设投资集团有限公司[盐城国资企业、盐城国资集团、盐城文化旅游、盐城基础设施、盐城土地开发、盐城粮食收储] | 河北徐工鲲鹏工程机械有限公司无锡分公司 | 仪器校准-计量检测-计量校准-中健计量检测(广东)有限公司 | 首页-南德电气集团-电能质量产品解决方案|能源数字化系统解决方案|新能源检测评估服务|电力/光伏/储能EPC工程总承包 | 阴_阳离子聚丙烯酰胺价格_聚合氯化铝厂家_聚合硫酸铁-巩义市亿洋水处理材料有限公司 | 深圳蓝枫印刷_画册印刷_彩页印刷_宣传册印刷_包装盒印刷_彩盒印刷厂_不干胶印刷厂 | 武汉牛凸科技有限公司 | 一次性妇科用品_一次性医疗用品_一次性口腔器械盒_天津市双利医疗器械有限责任公司 | 潍坊劲昊磁电科技有限公司-电磁除铁器,永磁除铁器,管道式除铁器,金属探测仪,磁滚筒,输送设备,给料设备,破碎设备 | 长焦监控摄像机-热成像夜视仪-激光云台-深圳红阳信息科技有限公司 | 永光机械-小型建筑机械领航者,公司专注于小型建筑、工程机械的研发与制造 | 世博磁力泵,耐腐蚀磁力泵,耐酸碱磁力泵,氟塑料磁力泵-苏州冠裕机电科技有限公司 | 芜湖藦卡机器人科技有限公司| 松下PLC经销商-松下传感器-放大器-电磁阀-光电开关-金器[东莞均钛]品牌气动元件及工控产品一站式供应商 | 永光机械-小型建筑机械领航者,公司专注于小型建筑、工程机械的研发与制造 | 中科迈金节能技术(浙江)有限公司 | 济南塑料袋,食品包装袋,复合塑料袋,方便袋-济南精美塑料包装厂 | 郫都人才网_郫都招聘网_求职找工作平台|