2014-03-04 6 views
0

fork() 및 pipe()에 대한 이해를 돕기 위해 노력하고 있습니다. pipe()는 두 프로세스간에 데이터를 전송하는 단방향 방법이라는 것을 알고 있습니다. 상위 프로세스에서 두 개의 정수 배열에 대해 pipe()를 호출 한 다음 fork하면 데이터를 양방향으로 전송할 수있는 두 개의 파이프가 효과적으로 생성됩니까? (부모가 표준에서 읽었고 자식이 표준 출력에 글을 쓰거나 유사하게 표준 출력에 부모 쓰기를하고 표준에서 읽은 자식을 표준에서 읽도록 하시겠습니까?)C : pipe() and fork()

+0

몇 가지 코드를 작성하고 사용해보십시오. 그러면 좀 덜 일반적인 질문을 할 수 있는데, 대답하기가 더 쉽습니다. – vanza

답변

5

아니요. pipe()을 한 번 호출하면 항상 파이프가 하나만 있습니다. 그러나, fork()이하는 일은 파일 설명자 테이블을 포함한 모든 것을 자식 프로세스에 복사한다는 것입니다. 따라서 부모와 자식 모두 파이프의 두 끝에 만 액세스 할 수 있습니다. 그렇기 때문에 학부모와 자녀의 사용하지 않는 쪽을 닫아야합니다. 즉 부모에게 글을 쓰고 어린이에게 읽으려는 경우 상위에 fd[0], 자녀에 fd[1]을 닫아야합니다. 파이프! 진짜 파이프라고 생각해보십시오. 물이 파이프 양끝에 쏟아지면 어떻게 될까요?

4

대답은 "아니오"입니다. fork()의 결과는 pipe()에 의해 반환 된 각 설명자가 복제 됨 (즉, dup()과 같음)이지만 파이프 자체는 부모와 자식 모두에 대해 동일한 파이프입니다. 파이프의 쓰기 끝 부분에 쓰면 읽기 끝에서 데이터를 사용할 수 있지만 부모와 자식의 읽기 끝은 동일합니다.

양방향 통신이 필요한 경우 pipe()을 두 번 호출 할 수 있습니다. 또는 socketpair()을 호출하여 양방향 통신을 지원하는 소켓 쌍을 만들 수 있습니다.