Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 352
  • Last Modified:

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.
0
aomega
Asked:
aomega
1 Solution
 
ozoCommented:
#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

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now