Wie so:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
Obwohl ich gelesen habe man fcntl
, kann ich nicht herausfinden, was es tut.
Es setzt das Close-on-Exec- Flag für den Dateideskriptor, wodurch der Dateideskriptor automatisch (und atomar) geschlossen wird, wenn eine der exec
Funktionen der Familie erfolgreich ist.
Außerdem wird der Rückgabewert getestet, um festzustellen, ob die Operation fehlgeschlagen ist. Dies ist eher nutzlos, wenn der Dateideskriptor gültig ist, da es keine Bedingung gibt, unter der diese Operation bei einem gültigen Dateideskriptor fehlschlagen sollte.
FILE *
) unternimmt, die dem Dateideskriptor zugeordnet sind. Eine gültige Verwendung für FD_CLOEXEC ist das Schließen einer Protokolldatei, die der übergeordnete Prozess beim Ausführen eines Shell-Prozesses geöffnet hat. Beachten Sie, dass POSIX 2008 eine Optionopen(2)
für O_CLOEXEC bietet. Sie können diese Eigenschaft also beim Öffnen der Datei festlegen. Dies ist sehr nützlich, sobald sie allgemein verfügbar ist.open
und nichtaccept
,socket
,pipe
usw ...dup()
unddup2()
sind davon nicht betroffen, natürlich). Sie müssten wahrscheinlich neue Funktionen mit einem zusätzlichen Parameter 'mode' oder 'flags' haben, was vermutlich der Grund ist, warum dies nicht geschehen ist. Wenn Sie O_CLOEXEC für den Socket verwenden könnten, könnten Sie annehmen, dassaccept()
dieses Flag auf dem zurückgegebenen Deskriptor geklont wird . Abersocket()
undpipe()
sind kniffliger.dup
unddup2
sind betroffen. Das Close-on-Exec-Flag gilt für Dateideskriptoren, nicht für geöffnete Dateibeschreibungen, sodass es nicht für doppelte Dateideskriptoren freigegeben wird. Das ist eine sehr gute Sache.dup3
,pipe2
, undaccept4
. Hatsocket
auch dasSOCK_CLOEXEC
Flag, das Sie mit dem angeforderten Socket-Typ kombinieren können.Es markiert den Dateideskriptor so, dass er
close()
automatisch aktiviert wird, wenn der Prozess oderfork()
untergeordnete Elemente eineexec*()
der Funktionsfamilien aufrufen. Dies ist nützlich, um zu verhindern, dass Ihre Dateideskriptoren an zufällige Programme weitergegeben werden, die zsystem()
.quelle