新聞中心

        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 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 博湖县| 柳林县| 通城县| 虎林市| 城市| 黔西县| 莱西市| 明星| 通河县| 林周县| 治县。| 舟曲县| 固镇县| 营山县| 阜康市| 英吉沙县| 高青县| 聊城市| 同德县| 库车县| 大理市| 平塘县| 乌审旗| 时尚| 南溪县| 应城市| 桂阳县| 固始县| 长岭县| 白河县| 临邑县| 高阳县| 成武县| 青田县| 宜川县| 光泽县| 新田县| 静海县| 吉林省| 汕尾市| 安康市|