In jedem Beispiel und jeder Diskussion, auf die ich im Zusammenhang mit der BSD-Socket-Programmierung stoße, scheint es, dass die empfohlene Methode, einen Dateideskriptor auf den nicht blockierenden E / A-Modus zu setzen, darin besteht, das O_NONBLOCK
Flag zu verwenden fcntl()
, z
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
Ich mache seit über zehn Jahren Netzwerkprogrammierung unter UNIX und habe den FIONBIO ioctl()
Aufruf immer dazu verwendet :
int opt = 1;
ioctl(fd, FIONBIO, &opt);
Ich habe nie wirklich darüber nachgedacht, warum. Habe es gerade so gelernt.
Hat jemand einen Kommentar zu den möglichen jeweiligen Vorzügen des einen oder anderen? Ich stelle mir vor, dass sich der Portabilitätsort etwas unterscheidet, weiß aber nicht, inwieweit ioctl_list(2)
dieser Aspekt einzelner ioctl
Methoden nicht angesprochen wird .
quelle
Wie @Sean sagte,
fcntl()
ist weitgehend standardisiert und daher plattformübergreifend verfügbar. Dieioctl()
Funktion ist älterfcntl()
als Unix, aber überhaupt nicht standardisiert. Dass dasioctl()
für Sie auf allen für Sie relevanten Plattformen funktioniert hat, ist ein Glücksfall, aber nicht garantiert. Insbesondere sind die für das zweite Argument verwendeten Namen geheimnisvoll und plattformübergreifend nicht zuverlässig. In der Tat sind sie häufig nur für den bestimmten Gerätetreiber gültig, auf den sich der Dateideskriptor bezieht. (Dieioctl()
Aufrufe für ein Bitmap-Grafikgerät, das vor zwanzig Jahren auf einem ICL Perq mit PNX (Perq Unix) ausgeführt wurde, wurden beispielsweise nirgendwo anders übersetzt.)quelle
Ich glaube, es
fcntl()
ist eine POSIX-Funktion. Wo wieioctl()
ist eine Standard-UNIX-Sache. Hier ist eine Liste von POSIX io .ioctl()
ist eine sehr kernel- / treiber- / betriebssystemspezifische Sache, aber ich bin sicher, dass das, was Sie verwenden, auf den meisten Unix-Varianten funktioniert. Einige andereioctl()
Dinge funktionieren möglicherweise nur unter bestimmten Betriebssystemen oder sogar bestimmten Umdrehungen des Kernels.quelle