• C

Redirecting outputs, Forking/Piping

Hi,
First time playing around with forks and pipes.  Basically say if i have someone input a command "command1 P command2 | command3".   In this case, the key value P will direct the standard error of command1 to standard in of command2 and standard output of command1 directed to the pipe '|' after command2.  I know i will need to create a new pipe, fork it and get the input from parent thru fd 2 somehow.  Thanks.
aomegaAsked:
Who is Participating?
 
ozoConnect With a Mentor Commented:
#include <stdio.h>
#include <unistd.h>
char *cmd0[]={"date","-u",0};
char *cmd1[]={"tr"," ","\n",0};
char *cmd2[]={"cat","-ve",0};
char *cmd3[]={"tr","$","_",0};
char **cmd[]={
  (char **)&cmd0,
  (char **)&cmd1,
  (char **)&cmd2,
  (char **)&cmd3,
};

#define N (sizeof(cmd)/sizeof(*cmd))
main(){
    double s0,s1;
    int pid[N];
    int fildes[N-1][2];
    int i;
    for( i=0; i<N; i+=1 ){
        if( i < N-1 ){ pipe(fildes[i]); }
        if( (pid[i]=fork())>0 ){
            if( i > 0 ){
                close(fildes[i-1][1]);
                close(fildes[i-1][0]);
             }
        }else if( pid[i]<0 ){
            perror("fork"); exit(1);
        }else{
            if( i>0 ){
              dup2(fildes[i-1][0],fileno(stdin));
              close(fildes[i-1][1]);
            }
            if( i<N-1 ){
              dup2(fildes[i][1],fileno(stdout));
              close(fildes[i][0]);
            }
            execvp(cmd[i][0],cmd[i]);
            perror(cmd[i][0]); exit(1);
        }
    }
    for( i=0; i<N; i+=1 ){
        int s;
        wait(&s);
    }
}
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.