2014-10-20 2 views
1

dup2() 기능을 사용하여 더 잘 이해하려고합니다.유닉스 dup2 시스템 호출 이해하기?

매뉴얼을 보면 두 가지 매개 변수가 필요합니다. 첫 번째는 기존 파일 설명 자이고 두 번째 매개 변수는 복사 된 파일 설명 자입니다.

나는 파이프의 쓰기 끝으로 stdout을 리다이렉션하려고 결정했다. 표준 출력으로 나는 코드가 있어야한다 생각 수동으로 판단

...

if ((dup2(STDOUT_FILENO, fd[1])) <= 0) 
    { 
     printf("error on dup \n"); 
    } 

write(STDOUT_FILENO, "Hi \n", 5); 

이제 [1] 전략 중을 복제 할 수있다. 그러므로 우리가 stdout에 쓴다면 우리는 파이프 끝을 써야합니다. 그러나 여전히 화면에 인쇄됩니다. 그래서 나는 그것이 fd [1]이어야하고 stdout이 뒤따라야한다고 생각했다. 그렇다면 stdout은 이제 fd [1]의 복사본이므로 이것이 작동하는 이유입니다.

마지막으로 화면에 다시 쓰고 싶다면 어떻게해야합니까?

답변

1

dup2의 프로토 타입은 다음과 같습니다. int dup2 (int oldfd, int newfd);

그래서 대처 :

dup2(STDOUT_FILENO, fd[1]) 

복사 FD에 decriptor 행 (이는 통상 1 일 것이다) STDOUT_FILENO와 연관된 스트림 [1]. 설명자 값 4를 fd [1]에 넣었다고 가정하고, 마지막에 1과 4가 모두 터미널 출력 tty/pty 인 "표준 출력 스트림"을 가리키게됩니다.

호출 후 (성공한 경우) fd [1]은 더 이상 파이프를 참조하지 않습니다. dup/dup2 기능을 파이프와 혼동하는 것 같습니다. pipe()은 읽기 및 쓰기 끝으로 설명자 쌍을 만듭니다. 그런 다음 포크라면 두 개의 프로세스를 파이프에 연결할 수 있습니다. 파이프가있는 하위 프로세스는 파이프를 STDIN_FILENO 또는 STDOUT_FILENO에 dup하여 표준 라이브러리 루틴이 읽기/쓰기로 생각하는 설명자에서 읽고 쓸 수 있습니다 터미널에.

0, 1, 2를 만드는 유일한 방법은 처음에는 터미널에서 열리 며 라이브러리 루틴은 숫자 (또는 매크로 SDTIN_FILENO 등)로 참조합니다. dup 호출은 기본적으로 참조 카운트를 증가시킵니다 특정 디스크립터에 대한 디스크립터를 생성하고, 디스크립터 슬롯을 원래의 슬롯에 링크시킨다.

원하는 것은 첫 번째 인수에 fd [1]을 전달하고 파이프를 표준 스트림에 연결하기 위해 STDOUT_FILENO에 dup합니다.