我发现了很多与此类似的问题(例如https://www.quora.com/How-can-I-write-a-code-for-PIPE-in-C-shell-script-python),这些问题适用于这些问题所描述的情况,但出于某种原因却不是我的问题。到目前为止,我找到的答案涉及从一个孩子到另一个孩子的管道输出(上述带括号的链接)或从孩子到父母/父母到孩子。我想要做的是让父母能够写入孩子的STDIN并从其STDOUT中读取。或者,在更一般的情况下,给定一定数量的子节点,让父节点写入第一个子节点STDIN,它将输出管道输出到第二个子节点,第二个节点将其输出管道传输到第三个子节点,依此类推,直到最后一个子句将其输出传递回父级。也就是说,我希望能够从C / C ++代码中执行prog0 | prog1 | prog 2 | ...
之类的操作。我目前的半尝试(一半是因为我在尝试使用像echo
之类的简单事件尝试完全输入/输出尝试之前只尝试从cat -
的STDOUT读取内容像这样(为简洁省略了一些错误检查):
void test() {
int pipe_fds[2];
pid_t cpid, wpid;
int status;
char buf[16] = {0};
status = pipe(pipe_fds);
cpid = fork();
if (cpid == 0) {
dup2(pipe_fds[1], STDOUT_FILENO);
close(pipe_fds[0]);
execlp("echo", "Hello world!", NULL);
printf("Child returned abnormally: %d\n", errno);
_exit(3);
}
close(pipe_fds[1]);
wpid = waitpid(cpid, &status, 0);
printf("Waited on pid %d, which exited with %d\n", wpid, WEXITSTATUS(status));
read(pipe_fds[0], buf, 16);
printf("Child said: %s\n", buf);
close(pipe_fds[0]);
exit(0);
}
这会运行,但父级没有来自子级的可见输出。我将如何解决这个问题,更重要的是,如何像我之前提到的那样,从一系列流程中加入管道?
答案 0 :(得分:0)
在这种情况下,问题是你调用execlp。尝试
execlp("echo", "echo", "Hello world!", NULL);