po中的popen vs系统函数

时间:2013-05-07 05:53:27

标签: c unix

使用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 相同的操作。

1 个答案:

答案 0 :(得分:4)

您作为示例提供的两个程序并不等效。 popen为您提供了一对文件句柄,您可以使用它们以交互方式读取和写入正在运行的进程的stdin / stdout的输入和输出。 system调用仅执行该调用,并将当前进程的stdin重定向到调用的子进程的stdin,并将该进程的stdout重定向到当前(主机)进程的stdout。

一般来说,这取决于你想要实现的目标。如果您的目标只是运行命令,system工作正常。如果您有兴趣以编程方式阅读其输出并进行处理(并可能产生更多输入),那么popen将会更好地工作。