我正在尝试实现一个类似 shell 的示例程序,它执行命令 ls |厕所
使用管道来实现命令。当我执行命令时,出现以下错误。
wc: 标准输入:错误的文件描述符 0 0 0 wc: -: 错误的文件描述符
请查看代码并提供输入 注意:1) parse 是一个库,它接收键入的输入并将每个命令作为带有 args 和必要数据的链表返回。解析工作正常 2)我在不同的子进程中执行每个命令,因此 fork
#include <stdio.h>
#include <stdlib.h>
#include "parse.h"
int pip[3][2];
int main(int argc, char *argv[], char *envp[])
{
Pipe p;
Cmd c;
pipe(pip[0]);
pipe(pip[1]);
pid_t pid;
pid=fork();
char *host = "armadillo";
printf("%s%% ", host);
p = parse();
c=p->head;
printf("1 \n");
pid=fork();
if(pid==0)
{
close(pip[0][0]);
close(STDOUT_FILENO);
dup2(pip[0][1],STDOUT_FILENO);
execvp(c->args[0],c->args);
}
else
{
waitpid(pid,NULL,0);
}
printf("2 \n");
close(pip[0][1]);
close(pip[0][0]);
c=c->next;
printf("%s \n",c->args[0]);
pid=fork();
if(pid==0)
{
close(STDIN_FILENO);
dup2(pip[0][0],STDIN_FILENO);
close(pip[0][1]);
execvp(c->args[0],c->args);
}
else
{
waitpid(pid,NULL,0);
close(pip[0][1]);
close(pip[0][0]);
}
}
最佳答案
这里有个主要问题:
close(pip[0][1]);
close(pip[0][0]);
...
dup2(pip[0][0],STDIN_FILENO);
close(pip[0][1]);
在这里您首先关闭文件描述符,然后稍后在程序中尝试再次使用它们。
关于c - 在 C 中实现管道时出现错误的文件描述符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26328010/