日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

          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://yuyingmama.com.cn/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]='