How to manage multiple pipes
c
Solution
To perform multiples pipes you need to store all your commands somewhere.
That's why I used a tab of structure.
So first, you need a tab or something to store all your commands:
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);
}
Then the function will run through the tab and launch everything.
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++;
}
}
}
Problem
I'm trying to implement a multiple pipe for my shell in C. All I have is a pipe function that pipe `a | b` but not `a | 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; ``` And this is a second version: ``` 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]; ``` How can I make this code manage multiple pipes?