W każdym przykładzie i dyskusji, którą prowadzę w kontekście programowania gniazd BSD, wydaje się, że zalecanym sposobem ustawienia deskryptora pliku na niezabezpieczony tryb wejścia/wyjścia jest użycie O_NONBLOCK
flagę do fcntl()
, npUNIX nonblocking I/O: O_NONBLOCK vs. FIONBIO
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
Robiłem programowania sieciowego w systemie UNIX przez ponad dziesięć lat, i zawsze stosować połączenia FIONBIO ioctl()
to zrobić:
int opt = 1;
ioctl(fd, FIONBIO, &opt);
naprawdę nigdy nie dał wiele myśli, dlaczego. Nauczyłem się tego w ten sposób.
Czy ktoś ma jakiś komentarz na temat możliwych zalet jednego lub drugiego? Wyobrażam sobie, że lokalizacja przenośności różni się nieco, ale nie wiem do jakiego stopnia jako ioctl_list(2)
nie mówi się o tym aspekcie indywidualnych metod.
Mam tendencję do używania ioctl(), ponieważ kosztuje mnie tylko jedna syscall, aby włączyć tryb bez blokowania zamiast dwóch dla fcntl(). Ponadto, Windows ioctlsocket() jest odpowiednikiem ioctl() dla celów tej funkcji. –
nginx robi to, jeśli potrafi i zaznacza je komentarzem "ioctl (FIONBIO) ustawia tryb bez blokowania za pomocą pojedynczej syscall." Teraz istnieje accept2, który pozwala ci zaakceptować połączenie i umieścić go w trybie bez blokowania w tej samej syscall. – Eloff