我正在尝试实现一个样例程序,类似于一个执行命令"ls | wc"的shell。
使用管道来实现该命令。当我执行这个命令时,我收到以下错误:
wc:标准输入:坏文件描述符 0 0 0 wc:-:坏文件描述符
请检查代码并提供反馈。注意: 1)解析是一个库,它接受输入并将每个命令作为带有参数和必要数据的链表返回。解析工作正常。 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]);
}
}