Tak jak to:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
Chociaż czytałem man fcntl
, nie wiem, co to robi.
Ustawia flagę close-on-exec dla deskryptora pliku, co powoduje, że deskryptor pliku jest automatycznie (i niepodzielnie) zamykany, gdy którykolwiek zexec
funkcji -family powiedzie się.
Sprawdza również wartość zwracaną, aby sprawdzić, czy operacja się nie powiodła, co jest raczej bezużyteczne, jeśli deskryptor pliku jest prawidłowy, ponieważ nie ma warunku, w którym operacja ta powinna zakończyć się niepowodzeniem na poprawnym deskryptorze pliku.
FILE *
) związanego z deskryptorem pliku. Jednym z poprawnych zastosowań FD_CLOEXEC jest zamknięcie pliku dziennika, który został otwarty przez proces nadrzędny podczas wykonywania procesu powłoki. Zauważ, że POSIX 2008 ma opcjęopen(2)
O_CLOEXEC - możesz więc ustawić tę właściwość podczas otwierania pliku, co będzie bardzo przydatne, gdy będzie powszechnie dostępny.open
nieaccept
,socket
,pipe
, itd ...dup()
idup2()
oczywiście nie ma to wpływu). Prawdopodobnie musiałbyś mieć nowe funkcje z dodatkowym parametrem „tryb” lub „flagi”, co prawdopodobnie jest powodem, dla którego tak się nie stało. Gdyby można było użyć O_CLOEXEC w gnieździe, można by przypuszczać,accept()
że sklonowałoby tę flagę w zwracanym deskryptorze. Alesocket()
ipipe()
są trudniejsze.dup
idup2
są dotknięte. Flaga close-on-exec dotyczy deskryptorów plików, a nie opisów otwartych plików, więc nie jest współdzielona między zduplikowanymi deskryptorami plików. To bardzo dobra rzecz.dup3
,pipe2
, iaccept4
. Równieżsocket
maSOCK_CLOEXEC
flagę można połączyć z żądanego typu gniazda.Zaznacza deskryptor pliku tak, że będzie on
close()
automatycznie d, gdy proces lub jakiekolwiek elementy podrzędne,fork()
które wywołuje, są jedną zexec*()
rodziny funkcji. Jest to przydatne, aby zapobiec wyciekowi deskryptorów plików do przypadkowych programów uruchamianych przez npsystem()
.źródło