execpipe.c (775B)
1 #include <unistd.h> 2 #include <stdio.h> 3 #include <sys/types.h> 4 #include <stdlib.h> 5 6 int process(int argc, char **argv); 7 8 void do_shell(char *cmd){ 9 execl("/bin/sh", "sh", "-c", cmd, (char *) 0); 10 } 11 12 void split(int argc, char **argv){ 13 int pipefd[2]; 14 if(pipe(pipefd)==-1){ 15 perror("Pipeline failed"); 16 exit(EXIT_FAILURE); 17 } 18 pid_t pid=fork(); 19 if(pid==-1){ 20 perror("Forking failed"); 21 exit(EXIT_FAILURE); 22 } 23 else if(pid==0){ 24 dup2(pipefd[0],STDIN_FILENO); 25 close(pipefd[1]); 26 process(argc-1,argv+1); 27 } 28 else{ 29 dup2(pipefd[1],STDOUT_FILENO); 30 close(pipefd[0]); 31 do_shell(argv[0]); 32 } 33 } 34 35 int process(int argc, char **argv){ 36 if(argc==1){ 37 do_shell(argv[0]); 38 } 39 else if(argc>1){ 40 split(argc,argv); 41 } 42 } 43 44 int main(int argc, char **argv){ 45 process(argc-1,argv+1); 46 }