我目前正在开发一个小型shell,而我正在尝试执行由多个命令组成的作业(例如" ls | sort")。 我在重定向方面遇到问题,因为排序程序似乎遇到了错误的文件描述符"。 这是代码:
第一个命令:
if (pipe(job->tubes[num_comm]) == -1)
{
perror("Erreur création tube");
exit(errno);
}
pid_t pid = fork();
if(pid==0) {
sig->sa_handler=SIG_DFL;
sigaction(SIGINT, sig, NULL);
close(job->tubes[num_comm][0]);
dup2(job->tubes[num_comm][1], 1);
close(job->tubes[num_comm][1]);
execvp(ligne_analysee->commandes[num_comm][0], ligne_analysee->commandes[num_comm]);
}
job->pids[num_comm]=pid;
close(job->tubes[num_comm][0]);
对于最后一个命令:
pid_t pid = fork();
if(pid==0) {
dup2(job->tubes[num_comm-1][1], 0);
close(job->tubes[num_comm-1][1]);
sig->sa_handler=SIG_DFL;
sigaction(SIGINT, sig, NULL);
execvp(ligne_analysee->commandes[num_comm][0], ligne_analysee->commandes[num_comm]);
}
job->pids[num_comm]=pid;
close(job->tubes[num_comm][1]);
感谢您的帮助!
答案 0 :(得分:1)
我误解了管道工作的方式,写入结束是由孩子修改而不是父母修改,阅读结束应该直接关闭在孩子身上。 父母应该让读取结束为下一个孩子从中读取(在我们的例子中是第二个命令)...谢谢,问题解决了!