2016-09-30 9 views
0

저는 두 개의 자식 프로세스를 생성하기 위해 두 번 포크하는 자식 프로세스를 만들고 싶었습니다. 하나의 출력으로 다른 출력으로 보냅니다. 이 예제 코드를 발견했습니다. 하지만 어떻게 작동하는지 혼란 스럽습니다. 을 찾았습니다 하지만 dup이 사용되는 방식과 작동 방식이 혼란 스럽습니다.이 예제에서는 dup 작업을 어떻게 사용합니까?

close(1); 
dup(fd[1]); 
close(fd[0]); 
close(fd[1]); 

출력은 다음 두 번째 갈래 프로세스에 파이프되고 그것의 파이프는 다음과 같이 연결되어 있습니다 :

close(0); 
dup(fd[0]); 
close(fd[0]); 
close(fd[1]); 
+1

예, 정확하게 적용됩니다. 'close (1); dup (fd [1]);'시퀀스는'dup2 (fd [1], 1) :'와 같습니다. –

답변

2

주요 관련 라인이 - 그들은 표준 관용구를 형성한다 (그러나 처음 두 라인을 dup2(fd[1], 1)으로 대체하는 것이 더 쉽습니다.)

close(1); 
dup(fd[1]); 
close(fd[0]); 
close(fd[1]); 

dup() 함수는 인수 파일 설명자를 가장 낮은 번호의 열지 않은 파일 설명자와 복제합니다. close()은 설명자 1을 닫고 설명자 0은 아직 열려 있으므로 은 표준 출력 1을 파이프 fd[1]의 쓰기 쪽을 참조합니다. 다른 두 개의 닫기 호출은 파이프의 양 끝을 올바르게 닫습니다. 프로세스가 파이프 fd[0]의 읽기 끝에서 읽지 않아야하며 표준 출력이 파이프의 쓰기 끝 부분에 쓰여지고 더 이상 다른 설명자가 필요하지 않게됩니다 (닫히지 않은 경우 문제가 발생할 수 있음).

따라서 파이프의 쓰기 끝을 프로세스의 표준 출력에 연결하는 표준 순서입니다. 두 번째 순서는 비슷하지만 파이프의 읽기 끝을 표준 입력에 연결합니다 (쓰기 끝 대신 표준 출력에 연결).

일반적으로 파이프의 한쪽 끝을 표준 입력 또는 표준 출력에 연결하면 두 끝이 모두 원래 파이프의 끝나야합니다.

아무런 문제가 없다고해도 오류 검사는 없었 음을 유의하십시오. 프로세스가 표준 출력 또는 표준 입력이 닫히기 시작한 경우가 아니면 모든 합리적인 기대와 달리 오류가 발생하지 않습니다.