在C中编码多个管道

我正在尝试在C中为我的shell实现多个管道。

我只有一个管道function管道| b但不是| b | C。

int c[2]; int returnv; pid_t id; pipe(c); pid = fork()) == 0 if (pid) { dup2(c[1], 0); close(p[1]); close(p[1]); execvp(array(0), array); } if ((pid = fork()) == 0) { dup2(p[0], 1); close(p(0)); close(p[0]); returnv = execvp(array[0], array); } close(p[1]); wait(NULL); wait(NULL); wait(NULL); return returnv; 

这是第二个版本:

 int i = 0; while (i < x) { pipe(c); if ((pid = fork()) == 0) { dup2(t[i], 1); if (i < 2) dup2(p[0], 1); close(p[1]); r= execvp(cmd[i][0], cmd[i]); } wait(NULL); close(p[0]); i += 1; t[i] = p[1]; 

我怎样才能添加一些能使这段代码管理多个管道的东西呢? 非常感谢提前!

编辑:根据您的评论

要执行多重管道,您需要将所有命令存储在某处。 这就是我使用结构选项卡的原因。

检查这个新版本可能更容易理解

首先,您需要一个选项卡或其他东西来存储所有命令:

 int main() { char *ls[] = {"ls", NULL}; char *grep[] = {"grep", "pipe", NULL}; char *wc[] = {"wc", NULL}; char **cmd[] = {ls, grep, wc, NULL}; loop_pipe(cmd); return (0); } 

然后是将运行选项卡并启动所有内容的函数

 void loop_pipe(char ***cmd) { int p[2]; pid_t pid; int fd_in = 0; while (*cmd != NULL) { pipe(p); if ((pid = fork()) == -1) { exit(EXIT_FAILURE); } else if (pid == 0) { dup2(fd_in, 0); //change the input according to the old one if (*(cmd + 1) != NULL) dup2(p[1], 1); close(p[0]); execvp((*cmd)[0], *cmd); exit(EXIT_FAILURE); } else { wait(NULL); close(p[1]); fd_in = p[0]; //save the input for the next command cmd++; } } } 

我将给出两个管道模型的工作版本以及三个管道模型的提示。 试一试,看看它是否有效。 注意:如果您没有包含正确的头文件,dup2()将是一场噩梦。

 #include  #include  #include  #include  #include  int p[2]; int pid; int r; main() { char *ls_args[] = {"ls", NULL}; char *grep_args[] = {"grep", "pipe", NULL}; pipe(p); pid = fork(); if (pid != 0) { // Parent: Output is to child via pipe[1] // Change stdout to pipe[1] dup2(p[1], 1); close(p[0]); r = execvp("ls", ls_args); } else { // Child: Input is from pipe[0] and output is via stdout. dup2(p[0], 0); close(p[1]); r = execvp("grep", grep_args); close(p[0]); } return r; } 

对于a | b | c,提示是使用两个管道,即p1 [2]和p2 [2]。 试试这个,让我们知道它是如何工作的。