我发现了很多与此类似的问题(例如https://www.quora.com/How-can-I-write-a-code-for-PIPE-in-C-shell-script-python),在这些问题描述的情况下有效,但由于某种原因不适用于我的情况。到目前为止,我找到的答案涉及从一个孩子到另一个孩子的管道输出(上述括号中的链接)或从孩子到父母/父母到孩子。我想要做的是让父母能够写入孩子的标准输入并从其标准输出中读取。或者,在更一般的情况下,给定一些孩子,让父级写入第一个孩子的 STDIN,这会将其输出通过管道传输到第二个孩子,第二个孩子将其输出通过管道传输到第三个,依此类推,直到最后一个child 将其输出通过管道返回给 parent。那是,prog0 | prog1 | prog 2 | ...
来自 C/C++ 代码。我目前的一半尝试(一半是因为我只是在echo
尝试使用简单的东西尝试完整输入/输出之前尝试从的 STDOUT读取cat -
)看起来像这样(为了简洁省略了一些错误检查):
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);
}
这会运行,但父级没有从子级获得可见输出。我将如何解决这个问题,更重要的是,我将如何像我之前提到的那样通过管道进出一系列流程?
在这种情况下,问题在于您对 execlp 的调用。尝试
execlp("echo", "echo", "Hello world!", NULL);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句