gpt4 book ai didi

c - 使用 dup2() 系统调用管道超过 3 个程序?

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:45 26 4
gpt4 key购买 nike

正在学习使用C的Linux系统调用,完全不懂dup2的用法。到目前为止,我为 2 个命令执行了 dup2 并且工作正常,但我想不出执行 3 个以上命令的方法。

例如,如果我想执行三个命令:

./program1  
./program2
./program3

假设这三个程序依赖于用户输入。我如何使用 fork()dup2() 来管道这些程序的输出?

我只用了 2 个命令就完成了,而且效果很好:

pid2=fork();
if(pid2==0)
{
close(pipe1[0]);
dup2(pipe1[1], STDOUT_FILENO);
close(pipe1[1]);
execvp("./addone",argp);
}
else
{
wait(NULL);
close(pipe1[1]);
dup2(pipe1[0], STDIN_FILENO);
close(pipe1[0]);
execvp("./addone",argp);
}

最佳答案

首先,您的 else 是多余的,因为 exec() 函数族用新的过程镜像替换了当前过程镜像 [exec(3) — Linux manual page] 。因此,子级将永远不会继续执行超过 if block ,而 else block 中的代码无论如何都是父级应该执行的代码。

用于模拟以下 bash 行为的 3 个进程 ./addone | ./添加| ./addone,你会想写这样的东西:

#include <unistd.h>         // dup2(), pipe(), fork(), execvp()
#include <sys/wait.h> // waitpid()
int main() {
int pipe1[2], pipe2[2];
int pid0, pid1, pid2;
char *argp = {"./addone", "first_argument", "second_argument", NULL};

pipe(pipe1);
pid0 = fork();
if (pid0 == 0) {
// close the read end of pipe1:
close(pipe1[0]);
// redirect stdout to the write end of pipe1:
dup2(pipe1[1], 1);

execvp("./addone", argp);
}

pipe(pipe2);
pid1 = fork();
if (pid1 == 0) {
// close the write end of pipe1:
close(pipe1[1]);
// close the read end of pipe2:
close(pipe2[0]);
// redirect stdin to the read end of pipe1:
dup2(pipe1[0], 0);
// redirect stdout to the write end of pipe2:
dup2(pipe2[1], 1);

execvp("./addone", argp);
}

pid2 = fork();
if (pid2 == 0) {
// close unused pipe1:
close(pipe1[0]);
close(pipe1[1]);
// close the write end of pipe2:
close(pipe2[1]);
// redirect stdin to the read end of pipe2:
dup2(pipe2[0], 0);

execvp("./addone", argp);
}

waitpid(pid0, NULL, 0);
waitpid(pid1, NULL, 0);
waitpid(pid2, NULL, 0);
}

关于c - 使用 dup2() 系统调用管道超过 3 个程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37259015/

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