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

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

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

          新聞中心

          EEPW首頁 > 嵌入式系統 > 設計應用 > 進程間通信之:管道

          進程間通信之:管道

          作者: 時間:2013-09-13 來源:網絡 收藏

          本文引用地址:http://yuyingmama.com.cn/article/257127.htm

          4.使用實例

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

          /*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)建一子進程*/

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

          {

          /*子進程關閉寫描述符,并通過使子進程暫停1s等待父進程已關閉相應的讀描述符*/

          close(pipe_fd[1]);

          sleep(DELAY_TIME*3);

          /*子進程讀取管道內容*/

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

          {

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

          }

          /*關閉子進程讀描述符*/

          close(pipe_fd[0]);

          exit(0);

          }

          elseif(pid>0)

          {

          /*父進程關閉讀描述符,并通過使父進程暫停1s等待子進程已關閉相應的寫描述符*/

          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);

          }

          /*關閉父進程寫描述符*/

          close(pipe_fd[1]);

          /*收集子進程退出信息*/

          waitpid(pid,NULL,0);

          exit(0);

          }

          }

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

          $./pipe

          Parentwrote17bytes:'PipeTestProgram'

          17bytesreadfromthepipeis'PipeTestProgram'

          5.管道讀寫注意點

          n 只有在管道的讀端存在時,向管道寫入數據才有意義。否則,向管道寫入數據的進程將收到內核傳來的SIGPIPE信號(通常為Brokenpipe錯誤)。

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

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

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

          linux相關文章:linux教程


          數字通信相關文章:數字通信原理


          通信相關文章:通信原理




          評論


          相關推薦

          技術專區(qū)

          關閉