Portál AbcLinuxu, 13. května 2024 09:21
#include <sys/types.h> #include <sys/event.h> #include <sys/time.h> #include <stdio.h> #include <fcntl.h> int main(void) { int kq, flags; if ((kq = kqueue()) == -1) return -1; if ((flags = fcntl(kq, F_GETFL, NULL)) == -1) return -1; printf("FD_CLOEXEC: %s\n", (flags & FD_CLOEXEC) ? "yes" : "no"); return 0; }Odpověď zní:
FD_CLOEXEC: no
#include <sys/types.h> #include <sys/event.h> #include <sys/time.h> #include <stdio.h> #include <fcntl.h> int main(void) { int kq, flags; if ((kq = kqueue()) == -1) return -1; if ((flags = fcntl(kq, F_GETFD, NULL)) == -1) /* Nikoli GETFL, ale GETFD*/ return -1; printf("FD_CLOEXEC: %s\n", (flags & FD_CLOEXEC) ? "yes" : "no"); return 0; }Závěr je ale stejný, COLOEXEC by default není, což je standardní, neznám žádný FD, který by tento bit měl ve výchozím stavu. Bit lze pak nastavit pomocí
fcntl(kq, F_SETFD, FD_CLOEXEC);Omlouvám se za počáteční zmatenost. FreeBSD mám na desktopu, ale programuji hlavně pro Linux.
COLOEXEC by default není, což je standardní, neznám žádný FD, který by tento bit měl ve výchozím stavu.Já taky ne, ale spoustě systémových volání jde nastavit flag, aby to tak bylo.
Omlouvám se za počáteční zmatenost. FreeBSD mám na desktopu, ale programuji hlavně pro Linux.Nic se neděje, alespoň se někdo snaží pomoci. Nastavit potom jde, ale protože se jedná o knihovnu, nemůžu zaručit, jak jsem zmínil výše, že uživatel nemá další vlákno, kde forkuje, a mezi kqueue() a fcntl() pak vzniká race-condition, kdy mi může deskriptor uniknout do uživatelova podprocesu.
The kqueue() system call creates a new kernel event queue and returns a descriptor. The queue is not inherited by a child created with fork(2).Proces před exec() většinou sebe fork()ne, takže v tomto případě nastavení CLOEXEC není třeba. Problém bude, když nějaké vlákno přímo zavolá exec() bez forknutí.
Tiskni Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.