Wie so:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
Obwohl ich gelesen habe man fcntl, kann ich nicht herausfinden, was es tut.
Wie so:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
Obwohl ich gelesen habe man fcntl, kann ich nicht herausfinden, was es tut.
Antworten:
Es setzt das Close-on-Exec- Flag für den Dateideskriptor, wodurch der Dateideskriptor automatisch (und atomar) geschlossen wird, wenn eine der execFunktionen 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.
openund nicht accept, socket, pipeusw ...
dup()und dup2()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, dass accept()dieses Flag auf dem zurückgegebenen Deskriptor geklont wird . Aber socket()und pipe()sind kniffliger.
dupund dup2sind 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, und accept4. Hat socketauch das SOCK_CLOEXECFlag, das Sie mit dem angeforderten Socket-Typ kombinieren können.
Es markiert den Dateideskriptor so, dass er close()automatisch aktiviert wird, wenn der Prozess oder fork()untergeordnete Elemente eine exec*()der Funktionsfamilien aufrufen. Dies ist nützlich, um zu verhindern, dass Ihre Dateideskriptoren an zufällige Programme weitergegeben werden, die z system().
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.