新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 進程控制開發之:實驗內容

        進程控制開發之:實驗內容

        作者: 時間:2013-09-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257129.htm

        7.4內容

        7.4.1編寫多進程程序

        1.目的

        通過編寫多進程程序,使讀者熟練掌握fork()、exec()、wait()和waitpid()等函數的使用,進一步理解在中多進程編程的步驟。

        2.內容

        該實驗有3個進程,其中一個為父進程,其余兩個是該父進程創建的子進程,其中一個子進程運行“ls-l”指令,另一個子進程在暫停5s之后異常退出,父進程先用阻塞方式等待第一個子進程的結束,然后用非阻塞方式等待另一個子進程的退出,待收集到第二個子進程結束的信息,父進程就返回。

        3.實驗步驟

        (1)畫出該實驗流程圖。

        該實驗流程圖如圖7.8所示。

        圖7.8實驗7.4.1流程圖

        (2)實驗源代碼。

        先看一下下面的代碼,這個程序能得到我們所希望的結果嗎,它的運行會產生幾個進程?請讀者回憶一下fork()調用的具體過程。

        /*multi_proc_wrong.c*/

        #includestdio.h>

        #includestdlib.h>

        #includesys/types.h>

        #includeunistd.h>

        #includesys/wait.h>

        intmain(void)

        {

        pid_tchild1,child2,child;

        /*創建兩個子進程*/

        child1=fork();

        child2=fork();

        /*子進程1的出錯處理*/

        if(child1==-1)

        {

        printf(Child1forkerrorn);

        exit(1);

        }

        elseif(child1==0)/*在子進程1中調用execlp()函數*/

        {

        printf(Inchild1:execute'ls-l'n);

        if(execlp(ls,ls,-l,NULL)0)

        {

        printf(Child1execlperrorn);

        }

        }

        if(child2==-1)/*子進程2的出錯處理*/

        {

        printf(Child2forkerrorn);

        exit(1);

        }

        elseif(child2==0)/*在子進程2中使其暫停5s*/

        {

        printf(Inchild2:sleepfor5secondsandthenexitn);

        sleep(5);

        exit(0);

        }

        else/*在父進程中等待兩個子進程的退出*/

        {

        printf(Infatherprocess:n);

        child=waitpid(child1,NULL,0);/*阻塞式等待*/

        if(child==child1)

        {

        printf(Getchild1exitcoden);

        }

        else

        {

        printf(Erroroccured!n);

        }

        do

        {

        child=waitpid(child2,NULL,WNOHANG);/*非阻塞式等待*/

        if(child==0)

        {

        printf(Thechild2processhasnotexited!n);

        sleep(1);

        }

        }while(child==0);

        if(child==child2)

        {

        printf(Getchild2exitcoden);

        }

        else

        {

        printf(Erroroccured!n);

        }

        }

        exit(0);

        }

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 无极县| 定襄县| 满洲里市| 宁武县| 凤山县| 秦安县| 友谊县| 金山区| 黄浦区| 嘉义市| 永平县| 阳新县| 甘谷县| 枣阳市| 绥德县| 休宁县| 社旗县| 庆城县| 玉田县| 安远县| 北碚区| 车险| 福清市| 砚山县| 温泉县| 锡林郭勒盟| 靖西县| 康乐县| 腾冲县| 白水县| 隆昌县| 民县| 林甸县| 巴彦县| 永清县| 阳山县| 蒙阴县| 合作市| 浦县| 同仁县| 固始县|