2016-12-27 8 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

파이프가 작동하는 방식을 잘못 이해했기 때문에 쓰기 끝을 자식이 수정하고 부모는 수정하지 말고 읽기 끝은 자식에서 직접 닫아야합니다. 부모는 다음 자식이 읽을 수 있도록 읽기 끝내기를 그대로 두어야합니다 (이 경우 두 번째 명령) ... 감사합니다. 문제가 해결되었습니다!