假设在一个程序中,我想执行两个进程,一个执行ls -al
命令,然后将结果通过管道传输到wc
命令中,并在终端上显示输出。如何使用管道文件描述符来实现这一点?到目前为止,我写的代码:
int main(int argc, char* argv[]) {
int pipefd[2];
int pipefd2[2];
pipe(pipefd2);
if ((fork()) == 0) {
dup2(pipefd2[1], STDOUT_FILENO);
close(pipefd2[0]);
close(pipefd2[1]);
execl("ls", "ls", "-al", NULL);
exit(EXIT_FAILURE);
}
if ((fork()) == 0){
dup2(pipefd2[0], STDIN_FILENO);
close(pipefd2[0]);
close(pipefd2[1]);
execl("/usr/bin/wc", "wc", NULL);
exit(EXIT_FAILURE);
}
close(pipefd[0]);
close(pipefd[1]);
close(pipefd2[0]);
close(pipefd2[1]);
}
字符串
举个例子会很有帮助。
2条答案
按热度按时间pod7payv1#
你的示例代码在语法和语义上都有问题(例如pipefd2没有decared,pipefd和pipefd2之间的混淆等等)。由于这看起来像是家庭作业,请确保你理解了我下面的注解,如果需要的话,请多问一些。我省略了pipe,fork和dup的错误检查,但它们应该在那里,理想情况下。
字符串
wvmv3b1j2#
代码
我已经尽可能彻底地注解掉了代码。我还添加了一些处理进程分叉和命令执行的小错误处理。正如@msw所指出的,您只需要一个管道就可以在两个进程之间进行单向通信。
字符串
编译并运行它:
型
您的结果将根据
ls-wc-pipe.c
运行的目录中的内容而有所不同。