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는 결함을 수정하는 새로운 인터페이스 dup3pipe2,, 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.