我试图实现一个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.
有人在我的代码中看到了这个缺陷吗?我无法弄清楚是为了挽救我的生命。
我添加了一些打印行语句,并为每个管道获取了错误的文件描述符。啊。
答案 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);
}