Tak jak to:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
Chociaż czytałem man fcntl, nie wiem, co to robi.
Tak jak to:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
Chociaż czytałem man fcntl, nie wiem, co to robi.
Odpowiedzi:
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.
opennie accept, socket, pipe, itd ...
dup()i dup2()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. Ale socket()i pipe()są trudniejsze.
dupi dup2są 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, i accept4. Również socketma SOCK_CLOEXECflagę 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ą z exec*()rodziny funkcji. Jest to przydatne, aby zapobiec wyciekowi deskryptorów plików do przypadkowych programów uruchamianych przez np system().
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.