【问题标题】:Shell and job with multiple commands带有多个命令的外壳和作业
【发布时间】:2016-12-27 14:19:04
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

    标签: c shell pipe fork dup2


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-27
      • 2015-10-19
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多