gpt4 book ai didi

c - 使用 Fork 和 Dup 的 Unix 管道

转载 作者:行者123 更新时间:2023-12-04 12:37:28 25 4
gpt4 key购买 nike

假设在一个程序中我想执行两个进程,一个是执行 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]);
}
一个例子会很有帮助。

最佳答案

您的示例代码在语法和语义上都被破坏了(例如 pipefd2 没有被 decared,pipefd 和 pipefd2 之间的混淆等)由于这听起来像作业,请确保您理解我下面的注释,如果需要,请询问更多。我省略了对 pipe、fork 和 dup 的错误检查,但理想情况下它们应该在那里。

int main(int argc, char *argv[]) {
int pipefd[2];
pid_t ls_pid, wc_pid;

pipe(pipefd);

// this child is generating output to the pipe
//
if ((ls_pid = fork()) == 0) {
// attach stdout to the left side of pipe
// and inherit stdin and stdout from parent
dup2(pipefd[1],STDOUT_FILENO);
close(pipefd[0]); // not using the right side

execl("/bin/ls", "ls","-al", NULL);
perror("exec ls failed");
exit(EXIT_FAILURE);
}

// this child is consuming input from the pipe
//
if ((wc_pid = fork()) == 0) {
// attach stdin to the right side of pipe
// and inherit stdout and stderr from parent
dup2(pipefd[0], STDIN_FILENO);

close(pipefd[1]); // not using the left side
execl("/usr/bin/wc", "wc", NULL);
perror("exec wc failed");
exit(EXIT_FAILURE);
}

// explicitly not waiting for ls_pid here
// wc_pid isn't even my child, it belongs to ls_pid

return EXIT_SUCCESS;
}

关于c - 使用 Fork 和 Dup 的 Unix 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2589906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com