坏文件描述符

时间:2010-04-08 02:32:23

标签: c pipe unix

有没有人看到这个问题,它的工作说错误的文件描述符不确定原因?

pipe(pipefd[0]);
if ((opid = fork()) == 0) {
     dup2(pipefd[0][1],1);/*send to output*/
     close(pipefd[0][0]);
     close(pipefd[0][1]);
     execlp("ls","ls","-al",NULL);
}

 if((cpid = fork())==0){
   dup2(pipefd[0][1],0);/*read from input*/
   close(pipefd[0][0]);
   close(pipefd[1][1]);
   execlp("grep","grep",".bak",NULL);
}

  close(pipefd[0][0]);
  close(pipefd[0][1]);

2 个答案:

答案 0 :(得分:1)

根据你的代码,我猜测pipefd被定义为:

int pipefd[2][2];

现在,当你这样做时:

pipe(pipefd[0])

这只会填充pipefd[0][0]pipefd[0][1]

所以当你这样做时:

# Bad descriptor
close(pipefd[1][1]);

您正在引用随机垃圾(您从未设置pipefd[1][0]pipefd[1][1])。

从显示的代码中,我看不出你为什么不这样做:

int pipefd[2];
pipe(pipefd);

答案 1 :(得分:0)

第二个区块中的索引看起来很可疑。