我正在开发一个使用execvp执行程序的程序.它需要捕获子进程的结果并在主进程中解析它们.似乎有一种方法,使用命名管道和重复.我试图找到一个很好的例子,但到目前为止还没有运气.如果有人对此有任何指示,链接和/或建议,我将非常感激.
你不需要命名管道; 未命名的管道工作得很好.实际上,通常你可以使用popen而不是自己做pipe/ fork/ dup/ exec. popen像这样工作(虽然你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);
}
Run Code Online (Sandbox Code Playgroud)
这会创建一个未命名的管道和forks.在孩子中,它将stdout(或stdin)重新连接到管道的一端,然后exec是孩子.父母可以简单地从管道的另一端读取(或写入).