【问题标题】:popen vs system function in CC中的popen vs系统函数
【发布时间】:2013-05-07 05:53:27
【问题描述】:

是使用popen的好处只是读取命令产生的输出,或者popen比系统有更多的好处或优势。

考虑以下两个程序:

方案一:

#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;
 }

方案二:

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

如果我可以在一行中完成与 Program2 中相同的操作,为什么还要使用 Program1。

【问题讨论】:

  • 如果你做一点研究,你会遇到this Stack Overflow thread。
  • 请注意,您应该在使用 popen() 打开的文件描述符上使用 pclose()。

标签: c unix


【解决方案1】:

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

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

【讨论】:

  • 来自 popen(3) 文档:Since a pipe is by definition unidirectional, the type argument may specify only reading or writing, not both -- 你在一边阅读,在另一边写作。在一个程序中,您无法在管道上读写。根据定义,它是单向的。您必须使用 pipe(2) 来实现这一壮举。
猜你喜欢
  • 2013-11-27
  • 1970-01-01
  • 2020-01-04
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多