首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >以最佳方式从system()命令捕获stdout

以最佳方式从system()命令捕获stdout
EN

Stack Overflow用户
提问于 2008-09-24 07:27:35
回答 7查看 84K关注 0票数 57

我正在尝试通过system()启动一个外部应用程序-例如,system("ls")。我想在它发生时捕获它的输出,这样我就可以将它发送到另一个函数进行进一步处理。在C/C++中做到这一点的最好方法是什么?

EN

回答 7

Stack Overflow用户

发布于 2008-09-24 07:38:00

摘自popen手册:

代码语言:javascript
复制
#include <stdio.h>

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

int pclose(FILE *stream);
票数 41
EN

Stack Overflow用户

发布于 2008-09-24 07:39:11

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

代码语言:javascript
复制
  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);
票数 33
EN

Stack Overflow用户

发布于 2008-09-24 07:37:00

编辑:将问题误读为希望将输出传递给另一个程序,而不是另一个函数。popen()几乎肯定是您想要的。

系统为您提供对shell的完全访问权限。如果你想继续使用它,你可以通过系统将它的输出重定向到一个临时文件(“ls> tempfile.txt"),但是选择一个安全的临时文件是一件痛苦的事情。或者,您甚至可以通过另一个程序重定向它: system("ls | otherprogram");

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

代码语言:javascript
复制
FILE *output = popen("ls", "r");

这将为您提供一个文件指针,您可以从中读取命令的输出。

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/125828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档