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

          新聞中心

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

          進程間通信之:管道

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

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

          8.2.4標準流

          1.標準流函數(shù)說明

          的文件操作中有基于文件流的標準I/O操作一樣,的操作也支持基于文件流的模式。這種基于文件流的管道主要是用來創(chuàng)建一個連接到另一個的管道,這里的“另一個”也就是一個可以進行一定操作的可執(zhí)行文件,例如,用戶執(zhí)行“ls-l”或者自己編寫的程序“./pipe”等。由于這一類操作很常用,因此標準流管道就將一系列的創(chuàng)建過程合并到一個函數(shù)popen()中完成。它所完成的工作有以下幾步。

          n 創(chuàng)建一個管道。

          n fork()一個子。

          n 在父子進程中關閉不需要的文件描述符。

          n 執(zhí)行exec函數(shù)族調(diào)用。

          n 執(zhí)行函數(shù)中所指定的命令。

          這個函數(shù)的使用可以大大減少代碼的編寫量,但同時也有一些不利之處,例如,它不如前面管道創(chuàng)建的函數(shù)那樣靈活多樣,并且用popen()創(chuàng)建的管道必須使用標準I/O函數(shù)進行操作,但不能使用前面的read()、write()一類不帶緩沖的I/O函數(shù)。

          與之相對應,關閉用popen()創(chuàng)建的流管道必須使用函數(shù)pclose()來關閉該管道流。該函數(shù)關閉標準I/O流,并等待命令執(zhí)行結(jié)束。

          2.函數(shù)格式

          popen()和pclose()函數(shù)格式如表8.2和表8.3所示。

          表8.2 popen()函數(shù)語法要點

          所需頭文件

          #includestdio.h>

          函數(shù)原型

          FILE*popen(constchar*command,constchar*type)

          函數(shù)傳入值

          command:指向的是一個以null結(jié)束符結(jié)尾的字符串,這個字符串包含一個shell命令,并被送到/bin/sh以-c參數(shù)執(zhí)行,即由shell來執(zhí)行

          type:

          “r”:文件指針連接到command的標準輸出,即該命令的結(jié)果產(chǎn)生輸出
          “w”:文件指針連接到command的標準輸入,即該命令的結(jié)果產(chǎn)生輸入

          函數(shù)返回值

          成功:文件流指針

          出錯:-1

          表8.3 pclose()函數(shù)語法要點

          所需頭文件

          #includestdio.h>

          函數(shù)原型

          intpclose(FILE*stream)

          函數(shù)傳入值

          stream:要關閉的文件流

          函數(shù)返回值

          成功:返回由popen()所執(zhí)行的進程的退出碼

          出錯:-1

          3.函數(shù)使用實例

          在該實例中,使用popen()來執(zhí)行“ps-ef”命令??梢钥闯觯琾open()函數(shù)的使用能夠使程序變得短小精悍。

          /*standard_pipe.c*/

          #includestdio.h>

          #includeunistd.h>

          #includestdlib.h>

          #includefcntl.h>

          #defineBUFSIZE1024

          intmain()

          {

          FILE*fp;

          char*cmd=ps-ef;

          charbuf[BUFSIZE];

          /*調(diào)用popen()函數(shù)執(zhí)行相應的命令*/

          if((fp=popen(cmd,r))==NULL)

          {

          printf(Popenerrorn);

          exit(1);

          }

          while((fgets(buf,BUFSIZE,fp))!=NULL)

          {

          printf(%s,buf);

          }

          pclose(fp);

          exit(0);

          }

          下面是該程序在目標板上的執(zhí)行結(jié)果。

          $./standard_pipe

          PIDTTYUidSizeStateCommand

          1root1832Sinit

          2root0S[keventd]

          3root0S[ksoftirqd_CPU0]

          ……

          74root1284S./standard_pipe

          75root1836Ssh-cps-ef

          76root2020Rps–ef

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

          linux相關文章:linux教程


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


          通信相關文章:通信原理




          評論


          相關推薦

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

          關閉
          看屁屁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); })();