<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          進(jìn)程間通信之:管道

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

          本文引用地址:http://www.ex-cimer.com/article/257127.htm

          4.使用實(shí)例

          在本例中,首先創(chuàng)建,之后父使用fork()函數(shù)創(chuàng)建子,之后通過關(guān)閉父的讀描述符和子進(jìn)程的寫描述符,建立起它們之間的通信。

          /*pipe.c*/

          #includeunistd.h>

          #includesys/types.h>

          #includeerrno.h>

          #includestdio.h>

          #includestdlib.h>

          #defineMAX_DATA_LEN256

          #defineDELAY_TIME1

          intmain()

          {

          pid_tpid;

          intpipe_fd[2];

          charbuf[MAX_DATA_LEN];

          constchardata[]=PipeTestProgram;

          intreal_read,real_write;

          memset((void*)buf,0,sizeof(buf));

          /*創(chuàng)建管道*/

          if(pipe(pipe_fd)0)

          {

          printf(pipecreateerrorn);

          exit(1);

          }

          /*創(chuàng)建一子進(jìn)程*/

          if((pid=fork())==0)

          {

          /*子進(jìn)程關(guān)閉寫描述符,并通過使子進(jìn)程暫停1s等待父進(jìn)程已關(guān)閉相應(yīng)的讀描述符*/

          close(pipe_fd[1]);

          sleep(DELAY_TIME*3);

          /*子進(jìn)程讀取管道內(nèi)容*/

          if((real_read=read(pipe_fd[0],buf,MAX_DATA_LEN))>0)

          {

          printf(%dbytesreadfromthepipeis'%s'n,real_read,buf);

          }

          /*關(guān)閉子進(jìn)程讀描述符*/

          close(pipe_fd[0]);

          exit(0);

          }

          elseif(pid>0)

          {

          /*父進(jìn)程關(guān)閉讀描述符,并通過使父進(jìn)程暫停1s等待子進(jìn)程已關(guān)閉相應(yīng)的寫描述符*/

          close(pipe_fd[0]);

          sleep(DELAY_TIME);

          if((real_write=write(pipe_fd[1],data,strlen(data)))!=-1)

          {

          printf(Parentwrote%dbytes:'%s'n,real_write,data);

          }

          /*關(guān)閉父進(jìn)程寫描述符*/

          close(pipe_fd[1]);

          /*收集子進(jìn)程退出信息*/

          waitpid(pid,NULL,0);

          exit(0);

          }

          }

          將該程序交叉編譯,下載到開發(fā)板上的運(yùn)行結(jié)果如下所示:

          $./pipe

          Parentwrote17bytes:'PipeTestProgram'

          17bytesreadfromthepipeis'PipeTestProgram'

          5.管道讀寫注意點(diǎn)

          n 只有在管道的讀端存在時(shí),向管道寫入數(shù)據(jù)才有意義。否則,向管道寫入數(shù)據(jù)的進(jìn)程將收到內(nèi)核傳來(lái)的SIGPIPE信號(hào)(通常為Brokenpipe錯(cuò)誤)。

          n 向管道寫入數(shù)據(jù)時(shí),將不保證寫入的原子性,管道緩沖區(qū)一有空閑區(qū)域,寫進(jìn)程就會(huì)試圖向管道寫入數(shù)據(jù)。如果讀進(jìn)程不讀取管道緩沖區(qū)中的數(shù)據(jù),那么寫操作將會(huì)一直阻塞。

          n 父子進(jìn)程在運(yùn)行時(shí),它們的先后次序并不能保證,因此,在這里為了保證父子進(jìn)程已經(jīng)關(guān)閉了相應(yīng)的文件描述符,可在兩個(gè)進(jìn)程中調(diào)用sleep()函數(shù),當(dāng)然這種調(diào)用不是很好的解決方法,在后面學(xué)到進(jìn)程之間的同步與互斥機(jī)制之后,請(qǐng)讀者自行修改本小節(jié)的實(shí)例程序。

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

          linux相關(guān)文章:linux教程


          數(shù)字通信相關(guān)文章:數(shù)字通信原理


          通信相關(guān)文章:通信原理




          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();