有人看到这个问题吗,说不正确的文件描述符不知道为什么不起作用?

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]);

最佳答案

根据您的代码,我猜测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);

10-08 01:55