2013-03-19 3 views
0

몇 가지 하위 프로세스와 양방향 통신이 필요한 응용 프로그램을 작성 중입니다. 부모님은 지속적으로 stdin에서 단어를 읽는 쿼리 엔진과 같아서 각 하위 프로세스에 전달합니다. 하위 프로세스는 처리를 수행하고 독점 파이프에서 상위 프로세스로 다시 씁니다.C 포크 및 파이프 닫는 끝

이것은 이론적으로 어떻게 작동해야하지만 구현 세부 사항에 머물러 있습니다. 첫 번째 문제는 아이를 분기하기 전에 2 개의 파이프를 만드는 것입니까? 포크를 할 때 부모가 파일 설명자를 상속받을 것이라는 것을 알고 있습니다. 이는 4 개의 파이프가 생성되거나 2 개의 파이프가 복제되었음을 의미합니다. 만약 그들이 자식에서 중복된다면, 이는 내가 자식에서 파일 기술자를 닫을 경우, 부모의 파일 기술자를 닫을 수도 있다는 것을 의미합니까?

내 이론은 다음과 같으며 간단히 설명이 필요하며 올바른 경로에 올려야합니다. 이것은 테스트되지 않은 코드입니다. 방금 제가 생각한 것에 대한 아이디어를주기 위해 썼습니다. 고마워, 어떤 도움을 주셔서 감사합니다.

int main(void){ 
    int fd[2][2]; //2 pipes for in/out 

    //make the pipes 
    pipe(fd[0]); //WRITING pipe 
    pipe(fd[1]); //READING pipe 

    if(fork() == 0){ 
     //child 
     //close some ends 
     close(fd[0][1]); //close the WRITING pipe write end 
     close(fd[1][0]); //close the READING pipe read end 

     //start the worker which will read from the WRITING pipe 
     //and write back to the READING pipe 
     start_worker(fd[0][0], fd[1][1]); 
    }else{ 
     //parent 
     //close the reading end of the WRITING pipe 
     close(fd[0][0]); 
     //close the writing end of the READING pipe 
     close(fd[1][1]); 
     //write data to the child down the WRITING pipe 
     write(fd[0][1], "hello\n", 6); 

     //read from the READING pipe 
     int nbytes; 
     char word[MAX]; 
     while ((nbytes = read(fd[1][0], word, MAXWORD)) > 0){ 
      printf("Data from child is: %s\n", word); 
     } 
    } 

} 

답변

1

파이프 자체는 하지 포크에 중복입니다.

단일 파이프는 단방향이며 2 개의 설명자 (읽기 용, 설명 용)가 있습니다. 따라서 프로세스 A에서 예를 닫습니다. 쓰기 디스크립터를 사용하면 프로세스 B에서 읽기 설명자를 닫습니다. -> B에서 A까지의 파이프가 있습니다.

한 프로세스에서 디스크립터를 닫은 것은 다른 프로세스의 디스크립터에 영향을 미치지 않습니다. 분기 후 각 프로세스는 자신의 설명자 공간을 가지며 부모 프로세스 설명자 사본입니다. 여기 fork() man 페이지에서 발췌 한 내용이다 :

자식 프로세스가 부모의 파일 기술자의 복사본을 가져야한다. 각 하위 파일 설명자는 동일한 열린 파일 설명과 해당 파일 설명자인 부모를 나타냅니다.

+0

오른쪽이 조금 깔끔 해지면 부모와 자녀 모두에서 올바른 파일 설명자를 닫을 수 있음을 명확히 할 수 있습니까? – 1337holiday

+0

예, 적어도 처음에는 제대로 보입니다. 그것을 실행하는 데 문제가 있습니까? –