DUtils

git clone git://xatko.vsos.ethz.ch/DUtils.git
Log | Files | Refs

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 }