中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

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

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

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

        本文引用地址:http://www.antipu.com.cn/article/257122.htm

        8.7內(nèi)容

        8.7.1

        1.目的

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

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

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

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

        (1)畫出流程圖。

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

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

        (2)編寫代碼。

        該實(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);

        }

        }

        /*以只讀非阻塞方式打開兩個(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)測試該文件描述符是否準(zhǔn)備就緒,并調(diào)用select()函數(shù)對相關(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]='