最佳地从system()命令捕获stdout

Sin*_*Dex 52 c c++ stdout system

我正试图通过system()- 例如,启动外部应用程序system("ls").我希望捕获它的输出,因此我可以将它发送到另一个函数进行进一步处理.在C/C++中最好的方法是什么?

jkr*_*mer 40

从popen手册:

#include <stdio.h>

FILE *popen(const char *command, const char *type);

int pclose(FILE *stream);
Run Code Online (Sandbox Code Playgroud)

  • 我想补充一点,这只适用于Posix系统.在我的Windows 7版本上没有popen函数,但是有一个_popen可以工作. (6认同)

小智 32

尝试popen()函数.它执行一个命令,如system(),但将输出定向到一个新文件.返回指向流的指针.

  FILE *lsofFile_p = popen("lsof", "r");

  if (!lsofFile_p)
  {
    return -1;
  }

  char buffer[1024];
  char *line_p = fgets(buffer, sizeof(buffer), lsofFile_p);
  pclose(lsofFile_p);
Run Code Online (Sandbox Code Playgroud)


wno*_*ise 7

编辑:误读问题,因为想要将输出传递给另一个程序,而不是另一个函数.popen()几乎可以肯定你想要的.

系统使您可以完全访问shell.如果要继续使用它,可以通过系统("ls> tempfile.txt")将其输出重定向到临时文件,但选择安全的临时文件很麻烦.或者,您甚至可以通过另一个程序重定向:system("ls | otherprogram");

有些人可能会推荐使用popen()命令.如果您可以自己处理输出,那么这就是您想要的:

FILE *output = popen("ls", "r");
Run Code Online (Sandbox Code Playgroud)

它将为您提供一个FILE指针,您可以使用命令的输出读取它.

您还可以使用pipe()调用与fork()一起创建连接以创建新进程,使用dup2()来更改它们的标准输入和输出,使用exec()来运行新程序,以及wait()在主程序中等待它们.这只是像shell一样设置管道.有关详细信息和示例,请参见pipe()手册页.


Nic*_*ynt 0

我不完全确定它在标准 C 中是否可能,因为两个不同的进程通常不共享内存空间。我能想到的最简单的方法是将第二个程序将其输出重定向到文本文件(programname > textfile.txt),然后读回该文本文件进行处理。然而,这可能不是最好的方法。