Nein und nein.
Sie müssen nur vorsichtig sein und Close-on-Exec für alle Dateideskriptoren festlegen, die Ihnen wichtig sind.
einstellen es einfach ist, aber:
#include <fcntl.h>
fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
#include <unistd.h>
/* please don't do this */
for (i = getdtablesize(); i --> 3;) {
if ((flags = fcntl(i, F_GETFD)) != -1)
fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
}
Wenn Sie Linux-Kernel laufen ≥ 2.6.23 und glibc ≥ 2.7, open
(zusammen mit anderen ähnlichen syscalls) übernimmt eine neue Flagge O_CLOEXEC
:
#include <unistd.h>
fd = open("...", ... | O_CLOEXEC);
Wenn Sie mit Linux-Kernel 2.6.24 ≥ und glibc ≥ 2.7, fcntl
ein neues Argument akzeptiert F_DUPFD_CLOEXEC
:
#include <fcntl.h>
newfd = fcntl(oldfd, F_DUPFD_CLOEXEC);
Wenn Sie Linux-Kernel 2.6.27 ≥ und glibc laufen ≥ 2.9 gibt es neue syscalls pipe2
, dup3
etc. und viele mehr syscalls gewinnen neue *_CLOEXEC
Fahnen:
#define _GNU_SOURCE
#include <unistd.h>
pipe2(pipefds, O_CLOEXEC);
dup3(oldfd, newfd, O_CLOEXEC);
beachten Sie, dass POSIXspecifies dass
Die popen() Funktion soll sicherstellen, dass alle Ströme von vorherigen popen() Aufrufen, die in dem übergeordneten Prozess geöffnet bleiben, in dem neuen unterordneten Prozess geschlossen werden.
also, wenn Sie besorgt sind über , dass Leck, nicht sein.
Wenn Sie die Dateideskriptoren durchlaufen, lesen Sie das Verzeichnis/proc/self/fd /, um nur die zu verwenden, die verwendet werden, und nicht jeden möglichen Dateideskriptor. – mark4o