pipe:错误的文件描述符

时间:2016-08-29 03:04:48

标签: c

我试图实现一个simpel c shell,它将管道任意数量的命令。这是相关的循环:

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

但是当我尝试运行命令时

cat file.txt | wc

我收到以下错误:

pipe: Bad file descriptor. 

有人在我的代码中看到了这个缺陷吗?我无法弄清楚是为了挽救我的生命。

我添加了一些打印行语句,并为每个管道获取了错误的文件描述符。啊。

1 个答案:

答案 0 :(得分:0)

糟糕的代码行位于for循环的最后。而不是

  }
  for(i=0;i<pipeNum*2;i++){
    close(pipes[i]);
  }
  for(i=0;i<pipeNum+1;i++){
    wait(&status);
  }
}

我应该

  }    
} 
for(i=0;i<pipeNum*2;i++){
    close(pipes[i]);
}
for(i=0;i<pipeNum+1;i++){
    wait(&status);
}