gpt4 book ai didi

c - 管道 : Bad file descriptor

转载 作者:行者123 更新时间:2023-11-30 16:57:57 27 4
gpt4 key购买 nike

我正在尝试实现一个 simpel c shell,它将通过管道传输任意数量的命令。这是相关的 for 循环:

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. 

有人看到我的代码中的缺陷吗?我想不出办法来挽救我的生命。

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

最佳答案

错误的代码行位于 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);
}

关于c - 管道 : Bad file descriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39197965/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com