2013-05-07 43 views
-2

使用popen的好處只是讀取命令產生的輸出,或者系統中有更多的好處或優點。popen vs C中的系統功能

考慮下面兩個方案:

計劃1:

#include <stdio.h> 

int main() 
{ 
    FILE *more,*who; 

    if (!(more = popen("more", "w"))) 
    { 
      printf("Command `more` not found!"); 
      return -1; 
    } 
    if (!(who = popen("who", "r"))) 
    { 
      printf("Command `who` not found!"); 
      return -1; 
    } 

    while (!feof(who)) 
    { 
      char buffer[100]; 
      if (fgets(buffer, 100, who) != NULL) 
      { 
        fputs(buffer, more); 
      } 
    } 

    fclose(more); 
    fclose(who); 
    return 0; 
} 

方案2:

#include <unistd.h> 
int main() 
{ 
    system("who|more"); 
    return 0; 
} 

我爲什麼要使用PROGRAM1如果我能做到同樣的事情在一個線如在Program2中所做的那樣。

+1

如果你做了一點研究,你會遇到[這個堆棧溢出線程](http://stackoverflow.com/questions/8538324/what-is-the-difference-between-popen-and-system-在-C)。 – 2013-05-07 06:46:33

+1

請注意,您應該在使用popen()打開的文件描述符上使用pclose()。 – 2013-11-16 12:11:41

回答

4

您提供的兩個程序作爲示例並不等同。 popen爲您提供了一對文件句柄,您可以使用它們以交互方式讀寫輸入和輸出到運行進程的stdin/stdout。調用system只是執行它並將當前進程的stdin重定向到被調用的子進程的stdin,並將該進程的stdout標記爲當前(主機)進程的標準輸出。

這取決於你一般想要達到的目標。如果你的目標只是運行一個命令,system工作正常。如果你有興趣以編程的方式閱讀它的輸出並處理它(並可能產生更多的輸入),那麼popen會更好地工作。

+0

從popen(3)文檔中可以看出:'由於管道的定義是單向的,所以類型參數可以只指定讀或寫,而不是兩個 - 你在一邊讀,而在另一邊寫。在一個程序中,你不能在管道上讀寫。根據定義它是單向的。你必須使用管道(2)來實現這個壯舉。 – 2013-11-16 12:06:20