FD_CLOEXEC fcntl () 플래그는 무엇을합니까?


82

이렇게 :

if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...

을 읽었지만 man fcntl그것이 무엇을하는지 알 수 없습니다.

답변:


74

파일 설명자 에 대한 close-on-exec 플래그를 설정하여 exec-family 함수 중 하나가 성공할 때 파일 설명자가 자동으로 (그리고 원자 적으로) 닫히도록합니다 .

또한 반환 값을 테스트하여 작업이 실패했는지 확인합니다. 유효한 파일 설명자에서이 작업이 실패해야하는 조건이 없기 때문에 파일 설명자가 유효한 경우에는 쓸모가 없습니다.


4
FILE *파일 설명자와 관련된 파일 스트림 ( )을 비우는 작업은 수행하지 않습니다 . FD_CLOEXEC의 유효한 용도 중 하나는 쉘 프로세스를 실행할 때 상위 프로세스가 연 로그 파일을 닫는 것입니다. POSIX 2008에는 open(2)O_CLOEXEC 에 대한 옵션이 있으므로 파일을 열 때이 속성을 설정할 수 있습니다.이 속성은 널리 사용 가능할 때 매우 유용합니다.
— Jonathan Leffler

파일이 열릴 때 플래그를 원자 적으로 설정하는 것은 다른 스레드가 외부 프로그램을 실행하는 동안 파일을 열 수있는 스레드 프로그램에 매우 중요합니다. 불행히도 만 사용할 수 open하지 accept, socket, pipe, 등 ...
— R .. GitHub의 STOP 돕기 ICE

네 - (하지만 기능을 생성하는 다른 파일 기술자에 O_CLOEXEC 또는 이에 상응하는 추가 설계 문제가있는 dup()및 dup2()물론, 영향을받지 않습니다). 아마도 추가 '모드'또는 '플래그'매개 변수가있는 새 기능이 있어야하는데, 이것이 발생하지 않은 이유 일 것입니다. 소켓에서 O_CLOEXEC를 사용할 수 있다면 accept()반환하는 설명자에서 해당 플래그를 복제 한다고 가정 할 수 있습니다. 그러나 socket()및 pipe()난이도가 있습니다.
— Jonathan Leffler

3
dup그리고 dup2영향을받습니다. close-on-exec 플래그는 열린 파일 설명이 아닌 파일 설명자에 적용되므로 중복 된 파일 설명자간에 공유되지 않습니다. 그것은 아주 좋은 일입니다.
— R .. GitHub STOP HELPING ICE

3
의견에 대한 대화에 이어 POSIX는 결함을 수정하는 새로운 인터페이스 dup3인 pipe2,, accept4. 또한 요청 된 소켓 유형과 결합 할 수 socket있는 SOCK_CLOEXEC플래그가 있습니다.
— R .. GitHub STOP HELPING ICE

33

close()프로세스 또는 자식 이 함수 패밀리 fork()중 하나를 호출 할 때 자동으로 d 가되도록 파일 설명자를 표시합니다 exec*(). 이것은 예를 들어 실행되는 임의의 프로그램에 파일 설명자를 유출하는 것을 방지하는 데 유용합니다 system().


이것이 보안 문제입니까?
— zach

1
@zach 당신은 그렇게 말할 수 있습니다; 하지만 분산 된 논리를 단일 엔티티로 캡슐화하는 것과 같이 실제로 수행하는 모든 리팩토링은 해당 엔티티의 잘못된 사용으로 인한 버그 가능성을 줄이고 "버그"는 추상적 인 것이므로 "보안 문제"라고 할 수 있습니다. 여기에는 특히 세그 폴트 및 정보 유출이 포함됩니다.
— Hi-Angel

그래서 소켓 코드를 리팩토링하고 있으며 소켓을 가져오고 원격 서버에 연결하는 사이에 F_SETFD를 사용하여 소켓의 FD에 FD_CLOEXEC 플래그를 추가합니다. 그런 다음 성공적인 연결 후 FD_CLOEXEC가 제거됩니다. 이 코드 영역과 관련된 exec () 호출을 찾을 수 없으며 제거해야했지만 제거되지 않은 이전 코드의 잔재인지 궁금합니다. 모든 목적을 찾기 위해 무엇을 찾아야할지 모르겠습니다.
— JoeManiaci
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.