新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 進(jìn)程間通信之:實(shí)驗(yàn)內(nèi)容

        進(jìn)程間通信之:實(shí)驗(yàn)內(nèi)容

        作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò) 收藏

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

        8.7內(nèi)容

        8.7.1

        1.目的

        通過(guò)編寫(xiě)有名管道多路通信實(shí)驗(yàn),讀者可進(jìn)一步掌握管道的創(chuàng)建、讀寫(xiě)等操作,同時(shí),也復(fù)習(xí)使用select()函數(shù)實(shí)現(xiàn)管道的通信。

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

        讀者還記得在6.3.3小節(jié)中,通過(guò)mknod命令創(chuàng)建兩個(gè)管道的實(shí)例嗎?本實(shí)例只是在它的基礎(chǔ)上添加有名管道的創(chuàng)建,而不用再輸入mknod命令。

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

        (1)畫(huà)出流程圖。

        該實(shí)驗(yàn)流程圖如圖8.9所示。

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

        (2)編寫(xiě)代碼。

        該實(shí)驗(yàn)源代碼如下所示。

        /*pipe_select.c*/

        #includefcntl.h>

        #includestdio.h>

        #includeunistd.h>

        #includestdlib.h>

        #includestring.h>

        #includetime.h>

        #includeerrno.h>

        #defineFIFO1in1

        #defineFIFO2in2

        #defineMAX_BUFFER_SIZE1024/*緩沖區(qū)大小*/

        #defineIN_FILES3/*多路復(fù)用輸入文件數(shù)目*/

        #defineTIME_DELAY60/*超時(shí)值秒數(shù)*/

        #defineMAX(a,b)((a>b)?(a):(b))

        intmain(void)

        {

        intfds[IN_FILES];

        charbuf[MAX_BUFFER_SIZE];

        inti,res,real_read,maxfd;

        structtimevaltv;

        fd_setinset,tmp_inset;

        fds[0]=0;

        /*創(chuàng)建兩個(gè)有名管道*/

        if(access(FIFO1,F_OK)==-1)

        {

        if((mkfifo(FIFO1,0666)0)(errno!=EEXIST))

        {

        printf(Cannotcreatefifofilen);

        exit(1);

        }

        }

        if(access(FIFO2,F_OK)==-1)

        {

        if((mkfifo(FIFO2,0666)0)(errno!=EEXIST))

        {

        printf(Cannotcreatefifofilen);

        exit(1);

        }

        }

        /*以只讀非阻塞方式打開(kāi)兩個(gè)管道文件*/

        if((fds[1]=open(FIFO1,O_RDONLY|O_NONBLOCK))0)

        {

        printf(Openin1errorn);

        return1;

        }

        if((fds[2]=open(FIFO2,O_RDONLY|O_NONBLOCK))0)

        {

        printf(Openin2errorn);

        return1;

        }

        /*取出兩個(gè)文件描述符中的較大者*/

        maxfd=MAX(MAX(fds[0],fds[1]),fds[2]);

        /*初始化讀集合inset,并在讀文件描述符集合中加入相應(yīng)的描述集*/

        FD_ZERO(inset);

        for(i=0;iIN_FILES;i++)

        {

        FD_SET(fds[i],inset);

        }

        FD_SET(0,inset);

        tv.tv_sec=TIME_DELAY;

        tv.tv_usec=0;

        /*循環(huán)測(cè)試該文件描述符是否準(zhǔn)備就緒,并調(diào)用select()函數(shù)對(duì)相關(guān)文件描述符做相應(yīng)操作*/

        while(FD_ISSET(fds[0],inset)

        ||FD_ISSET(fds[1],inset)||FD_ISSET(fds[2],inset))

        {

        /*文件描述符集合的備份,免得每次進(jìn)行初始化*/

        tmp_inset=inset;

        res=select(maxfd+1,tmp_inset,NULL,NULL,tv);

        switch(res)

        {

        case-1:

        {

        printf(Selecterrorn);

        return1;

        }

        break;

        case0:/*Timeout*/

        {

        printf(Timeoutn);

        return1;

        }

        break;

        default:

        {

        for(i=0;iIN_FILES;i++)

        {

        if(FD_ISSET(fds[i],tmp_inset))

        {

        memset(buf,0,MAX_BUFFER_SIZE);

        real_read=read(fds[i],buf,MAX_BUFFER_SIZE);

        if(real_read0)

        {

        if(errno!=EAGAIN)

        {

        return1;

        }

        }

        elseif(!real_read)

        {

        close(fds[i]);

        FD_CLR(fds[i],inset);

        }

        else

        {

        if(i==0)

        {/*主程序終端控制*/

        if((buf[0]=='q')||(buf[0]=='Q'))

        {

        return1;

        }

        }

        else

        {/*顯示管道輸入字符串*/

        buf[real_read]='

        主站蜘蛛池模板: 且末县| 虞城县| 蒙山县| 育儿| 无为县| 沙湾县| 泰顺县| 饶平县| 姚安县| 关岭| 和林格尔县| 卓尼县| 景德镇市| 黄浦区| 霍邱县| 长岭县| 大石桥市| 晴隆县| 浪卡子县| 剑川县| 荆州市| 二连浩特市| 汉沽区| 青川县| 宁远县| 天镇县| 中超| 茌平县| 斗六市| 安乡县| 恩平市| 满洲里市| 阳西县| 宣化县| 仲巴县| 谢通门县| 怀安县| 河曲县| 东平县| 蒙山县| 九龙坡区|