如何捕获execvp的输出

我正在开发一个使用execvp执行程序的程序。 它需要捕获subprocess的结果并在主进程中parsing它们。 似乎有一种方法,使用命名pipe道,并复制。 我试图寻找一个很好的例子,但迄今没有运气。 如果有人有任何关于此的指针,链接和/或build议,我将不胜感激。

你不需要命名管道; 未命名的管道工作得很好。 实际上,你可以使用popen而不是自己做pipe / fork / dup / execpopen工作是这样的(尽管你的libc的实现可能有更多的错误检查):

 FILE *popen(const char *command, const char *type) { int fds[2]; const char *argv[4] = {"/bin/sh", "-c", command}; pipe(fds); if (fork() == 0) { close(fds[0]); dup2(type[0] == 'r' ? 0 : 1, fds[1]); close(fds[1]); execvp(argv[0], argv); exit(-1); } close(fds[1]); return fdopen(fds[0], type); } 

这将创建一个未命名的管道和fork 。 在孩子,它重新附加标准输出(或标准输入)到管道的一端,然后exec这个孩子。 父母可以简单地从管道的另一端读取(或写入)。

你不能只用popen()吗?

下面是一个简单的例子,展示了使用popen来实现你的目标。 只要把比“回声”更有趣的东西作为命令:)

 #include <stdio.h> int main() { char buf[100]; int i = 0; FILE *p = popen("echo \"Test\"","r"); if (p != NULL ) { while (!feof(p) && (i < 99) ) { fread(&buf[i++],1,1,p); } buf[i] = 0; printf("%s",buf); pclose(p); return 0; } else { return -1; } }