c - pipe: Bad file descriptor -
i'm trying implement simpel c shell pipeline arbitrary number of commands. here relevant loop:
int status; int i,j,inputfile,outputfile,pid; int pipenum = info->pipenum; struct commandtype *command; int pipes[pipenum * 2]; for(i=0;i<pipenum;i++){ pipe(pipes+2*i); printf("pipe number %d created\n", i+1); } for(j=0;j<=pipenum;j++){ if( ( pid=fork() ) ==0 ){ if(j!=0){ if(dup2(pipes[(j-1)*2],stdin_fileno)<0){ perror("pipe"); exit(2); } } if(j!=pipenum){ if(dup2(pipes[2*j+1],stdout_fileno)<0){ perror("pipe"); exit(2); } } if(j==0 && info->boolinfile==1){ if((inputfile = open(info->infile,o_rdonly))<0){ perror("file"); exit(2); } if(dup2(inputfile,stdin_fileno)<0){ perror("dup2"); exit(2); } } if(j==pipenum && info->booloutfile){ if((outputfile = open(info->outfile,o_wronly | o_creat | o_trunc, 666)<0)){ perror("file"); exit(2); } if(dup2(outputfile,stdout_fileno)<0){ perror("dup2"); exit(2); } } for(i=0;i<pipenum*2;i++){ close(pipes[i]); } command=&info->commarray[j]; execvp(command->varlist[0],command->varlist); perror("bad command"); } for(i=0;i<pipenum*2;i++){ close(pipes[i]); } for(i=0;i<pipenum+1;i++){ wait(&status); } }
but when try run command
cat file.txt | wc
i following error:
pipe: bad file descriptor.
does see flaw in code here? can't figure out save life.
i have added print line statements , bad file descriptor every single pipe. ugh.
the bad lines of code @ end of loop. instead of
} for(i=0;i<pipenum*2;i++){ close(pipes[i]); } for(i=0;i<pipenum+1;i++){ wait(&status); } }
i should have
} } for(i=0;i<pipenum*2;i++){ close(pipes[i]); } for(i=0;i<pipenum+1;i++){ wait(&status); }
Comments
Post a Comment