2016-12-08 11 views
4

C 프로그래밍 (Linux-UNIX-Programmierung, Jürgen Wolf 저)에 대한 (독문학) 책에서 영어로 번역 된 문장은 다음과 같을 것입니다. 나를) :C : dup 및 close-on-exec

어떤 경우에는 파일 설명자 [1]를 복제해야 할 수도 있습니다. 예를 들어 부모 프로세스가 자식 프로세스와 데이터를 교환하려고하고 자식 프로세스가 exec*() [2]를 사용하여 새 프로세스로 겹쳐진 경우입니다. 이 경우, dup() or dup2()이 없으면 exec-close 플래그가 설정됩니다 [3]. 이 플래그가 설정되면, 모든 파일 기술자는 (새로운 프로세스에 의해 겹쳐지기 때문에) 무효화됩니다. 즉, 더 이상 존재하지 않습니다 [4]. 따라서 부모 프로세스와 자식 프로세스 간의 통신은 중단된다 [5]. 반면에 파일 설명자를 dup() or dup2()으로 복제하면 exec-close 플래그가 삭제되고 새로 오버레이 된 프로세스가이 파일 설명자를 사용하여 [6] 통신 할 수 있습니다.

위의 단락에는 오해의 소지가있는 여러 진술 또는 오류가 포함되어 있다고 생각됩니다. dup() 또는 dup2()를 사용하지 않고 근접에-간부 플래그를 설정해야하는 이유 문장에서

[3], 이해가 안 돼요?

+0

아마도 그들은 호출자가 * close-on-exec * 플래그를 설정 한 디스크립터를 알지 못하는 라이브러리 함수에 대해 이야기하고있는 것이므로 최악의 경우를 가정해야합니다. – Barmar

+2

또한 라이브러리는 호출자가 사용중인 파일 설명자의 상태를 변경하지 않아야합니다. – Barmar

+0

@Barmar 그의 목적이 아니라면 ncurses, libcaca 등 – Stargateur

답변

1

조언이 잘못되었습니다. close-on-exec는 프로그램이 명시 적으로 exec-close-on을 요청한 파일 설명자에서만 설정됩니다. 표준 입력에 해당하는

  • 실행하는 프로세스가 I/O가 특정 파일 기술자 (일반적으로 0, 1을 통해이 될 것으로 예상하고, 2 :

    당신이 할 수 dup2를 사용하도록 선택할 수 있습니다 이유는 , 출력 및 오류 스트림 각각) 또는

  • 어떤 이유로 든 프로세스가 일부 파일 설명자를 닫을 것이므로이 fd가 닫힐 범위 밖에 있어야합니다.

설명은 또한 약간 잘못 - 그것은 밀접한 온 간부 해제에만 새로운 디스크립터 (dup() 또는 dup2()에서, 즉 리턴 값). 원래 fd의 close-on-exec 상태는 변경되지 않습니다.