이렇게 :
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
을 읽었지만 man fcntl그것이 무엇을하는지 알 수 없습니다.
답변:
파일 설명자 에 대한 close-on-exec 플래그를 설정하여 exec-family 함수 중 하나가 성공할 때 파일 설명자가 자동으로 (그리고 원자 적으로) 닫히도록합니다 .
또한 반환 값을 테스트하여 작업이 실패했는지 확인합니다. 유효한 파일 설명자에서이 작업이 실패해야하는 조건이 없기 때문에 파일 설명자가 유효한 경우에는 쓸모가 없습니다.
open하지 accept, socket, pipe, 등 ...
dup()및 dup2()물론, 영향을받지 않습니다). 아마도 추가 '모드'또는 '플래그'매개 변수가있는 새 기능이 있어야하는데, 이것이 발생하지 않은 이유 일 것입니다. 소켓에서 O_CLOEXEC를 사용할 수 있다면 accept()반환하는 설명자에서 해당 플래그를 복제 한다고 가정 할 수 있습니다. 그러나 socket()및 pipe()난이도가 있습니다.
dup그리고 dup2영향을받습니다. close-on-exec 플래그는 열린 파일 설명이 아닌 파일 설명자에 적용되므로 중복 된 파일 설명자간에 공유되지 않습니다. 그것은 아주 좋은 일입니다.
dup3인 pipe2,, accept4. 또한 요청 된 소켓 유형과 결합 할 수 socket있는 SOCK_CLOEXEC플래그가 있습니다.
close()프로세스 또는 자식 이 함수 패밀리 fork()중 하나를 호출 할 때 자동으로 d 가되도록 파일 설명자를 표시합니다 exec*(). 이것은 예를 들어 실행되는 임의의 프로그램에 파일 설명자를 유출하는 것을 방지하는 데 유용합니다 system().
FILE *파일 설명자와 관련된 파일 스트림 ( )을 비우는 작업은 수행하지 않습니다 . FD_CLOEXEC의 유효한 용도 중 하나는 쉘 프로세스를 실행할 때 상위 프로세스가 연 로그 파일을 닫는 것입니다. POSIX 2008에는open(2)O_CLOEXEC 에 대한 옵션이 있으므로 파일을 열 때이 속성을 설정할 수 있습니다.이 속성은 널리 사용 가능할 때 매우 유용합니다.