使用popen的好处是只读取命令产生的输出,或者popen比系统更多的好处或优点。
考虑以下两个程序:
计划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 相同的操作。
答案 0 :(得分:4)
您作为示例提供的两个程序并不等效。 popen
为您提供了一对文件句柄,您可以使用它们以交互方式读取和写入正在运行的进程的stdin / stdout的输入和输出。 system
调用仅执行该调用,并将当前进程的stdin重定向到调用的子进程的stdin,并将该进程的stdout重定向到当前(主机)进程的stdout。
一般来说,这取决于你想要实现的目标。如果您的目标只是运行命令,system
工作正常。如果您有兴趣以编程方式阅读其输出并进行处理(并可能产生更多输入),那么popen
将会更好地工作。