<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    popen的用法及與system調用的區別

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    首先用man查看下popen的介紹:

     

    popen(3) - Linux man page

    Name

     

    popen, pclose - pipe stream to or from a process

    Synopsis

    #include <stdio.h>
    
    FILE *popen(const char *command, const char *type);
    
    int pclose(FILE *stream);

     

    popen總是和pclose一起出現被使用的。popen() 創建一個管道,通過fork或者invoke一個子進程,然后執行command。返回值在標準IO流中,由于是在管道之中,因此數據流是單向的,command只能產生stdout或者讀取stdin,因此type只有兩個值:‘w’或‘r’。r表示command從管道中讀取數據流,而w表示command的stdout輸出到管道中。command無法同時讀取和輸出。popen返回該FIFO數據流的指針。

    舉例用法(http://linux.chinaitlab.com/c/806015.html):

     

      管道讀:先創建一個文件test,然后再test文件內寫入“Read pipe successfully !”

      #include “stdio.h”

      #include “stdlib.h”

      int main()

      {

      FILE *fp;

      char buf[200] = {0};

      if((fp = popen(“cat test”, “r”)) == NULL) {

      perror(“Fail to popen\n”);

      exit(1);

      }

      while(fgets(buf, 200, fp) != NULL) {

      printf(“%s”, buf);

      }

      pclose(fp);

      return 0;

      }

      打印輸出: Read pipe successfully !

      管道讀:

      #include “stdio.h”

      #include “stdlib.h”

      int main()

      {

      FILE *fp;

      char buf[200] = {0};

      if((fp = popen(“cat > test1″, “w”)) == NULL) {

      perror(“Fail to popen\n”);

      exit(1);

      }

      fwrite(“Read pipe successfully !”, 1, sizeof(“Read pipe successfully !”), fp);

      pclose(fp);

      return 0;

      }

      執行完畢后,當前目錄下多了一個test1文件,打開,里面內容為Read pipe successfully !

    ---------------------------------------------------------------------------------------------

    對于管道讀例子已經很清楚,而管道寫可能用的地方比較少。而對于寫可能更常用的是system函數:

    system("cat "Read pipe successfully!" > test1")

    可以看出,popen可以控制程序的輸入或者輸出,而system的功能明顯要弱一點,比如無法將ls的結果用到程序中。如果不需要使用到程序的I/O數據流,那么system是最方便的。

    而且system函數是C89和C99中標準定義的,可以跨平臺使用。而popen是Posix 標準函數,可能在某些平臺無法使用(windows應該是可以的吧,沒做過測試)。

    如果上述兩個函數還無法滿足你的交互需求,那么可以考慮exec函數組了。

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全