Codificación de tubería múltiple en C

Estoy tratando de implementar una tubería múltiple para mi shell en C.

Todo lo que tengo es una función de tubería que canaliza una | b pero no un | b | do.

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; 

Y esta es una segunda versión:

 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]; 

¿Cómo puedo agregar el pequeño elemento que hará que este código administre varias tuberías, por favor? Muchas gracias por adelantado !

Edición: según tu comentario.

Para realizar múltiples tuberías necesitas almacenar todos tus comandos en algún lugar. Es por eso que utilicé una pestaña de estructura.

Compruebe esta nueva versión tal vez más fácil de entender

Así que primero necesitas una pestaña o algo para almacenar todos tus comandos:

 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); } 

A continuación, la función que ejecutará a través de la pestaña y lanzará todo

 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++; } } } 

Daré una versión de trabajo del modelo de dos tuberías y una sugerencia para el modelo de tres tuberías. Pruébalo y ve si funciona. NOTA: Si no incluye los archivos de encabezado adecuados, dup2 () será una pesadilla.

 #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; } 

Para a | b | c, la sugerencia es usar dos tuberías, es decir, p1 [2] y p2 [2]. Prueba esto y haznos saber cómo funciona.