具有多个命令的Shell和作业

时间:2016-12-27 14:19:04

标签: c shell pipe fork dup2

我目前正在开发一个小型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]);

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我误解了管道工作的方式,写入结束是由孩子修改而不是父母修改,阅读结束应该直接关闭在孩子身上。 父母应该让读取结束为下一个孩子从中读取(在我们的例子中是第二个命令)...谢谢,问题解决了!