2016-12-27 102 views
0

我目前正在研究一个小外壳,并试图执行由多个命令组成的作业(如“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

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