In jedem Beispiel und Diskussion im Rahmen der BSD-Socket-Programmierung scheint es, dass die empfohlene Methode zum Festlegen eines Dateideskriptors auf nicht blockierende E/A-Modus ist Flagge zu fcntl()
, zBUNIX nonblocking E/A: O_NONBLOCK vs. FIONBIO
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
Ich habe seit über zehn Jahren zu tun Netzwerkprogrammierung in UNIX worden und haben die FIONBIO ioctl()
nennen dies immer zu tun pflegen:
int opt = 1;
ioctl(fd, FIONBIO, &opt);
Nie gab viel Gedanken wirklich, warum. Habe es gerade so gelernt.
Hat jemand irgendwelche Kommentare über die möglichen jeweiligen Vorteile des einen oder anderen? Ich stelle mir vor, die Portabilität Locus unterscheidet sich etwas, aber weiß nicht, in welchem Ausmaß, wie ioctl_list(2)
spricht nicht mit diesem Aspekt der einzelnen Methoden ioctl
.
Ich neige dazu, ioctl() dafür zu verwenden, weil es mich kostet, nur einen syscall, um nicht-blockierenden Modus statt zwei für fcntl() zu aktivieren. Darüber hinaus entspricht die Windows ioctlsocket() API ioctl() für diese Zwecke. –
nginx tut dies, wenn es möglich ist, und markiert es mit einem Kommentar "ioctl (FIONBIO) setzt einen nicht blockierenden Modus mit dem einzelnen syscall." Jetzt gibt es accept2, mit dem Sie eine Verbindung annehmen und sie im selben syscall in den nicht blockierenden Modus versetzen können. – Eloff