2013-05-07 41 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