Implementing pipe in C
c, linux, pipe
Solution
This does virtually no error checking, but why so complicated?
int main (int argc, char ** argv) {
int i;
for( i=1; i<argc-1; i++)
{
int pd[2];
pipe(pd);
if (!fork()) {
dup2(pd[1], 1); // remap output back to parent
execlp(argv[i], argv[i], NULL);
perror("exec");
abort();
}
// remap output from previous child to input
dup2(pd[0], 0);
close(pd[1]);
}
execlp(argv[i], argv[i], NULL);
perror("exec");
abort();
}
Problem
I am trying to implement pipe in C. eg - `$ ls | wc | wc` I have written the following code - ``` #include<stdio.h> #include<stdlib.h> #include <unistd.h> void run_cmd(char *cmd, int* fd_in, int* fd_out) { int c = fork(); if (c==0) { if (fd_in != NULL) { close(fd_in[1]); dup2(fd_in[0], 0); } if (fd_out != NULL) { close(fd_out[0]); dup2(fd_out[1],1); } execlp(cmd, cmd, NULL); } } int main(int argc, char **argv) { int fd_1[2], fd_2[2], i; pipe(fd_1); pipe(fd_2); run_cmd(argv[1], NULL, fd_1); for( i=2; i<argc-1; i++) { if (i%2 == 0) run_cmd(argv[i], fd_1, fd_2); else run_cmd(argv[i], fd_2, fd_1); } if (i%2 == 0) run_cmd(argv[i], fd_1, NULL); else run_cmd(argv[i], fd_2, NULL); } ``` This works fine with two arguments, eg - `$./a.out ls wc` But when I try with more than two arguments it does not work. Would anyone please tell me what's wrong with my code, or any other way to do this?