В каждом примере и обсуждении, которое я просматриваю в контексте программирования сокетов BSD, кажется, что рекомендуемый способ установки дескриптора файла в неблокирующий режим ввода-вывода использует флаг O_NONBLOCK для fcntl(), например
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
Я занимаюсь сетевым программированием в UNIX уже более десяти лет и всегда использовал вызов FIONBIO ioctl() для этого:
int opt = 1;
ioctl(fd, FIONBIO, &opt);
Никогда не думал о том, почему. Просто научился этому.
Есть ли у кого-нибудь комментарии относительно возможных соответствующих достоинств того или другого? Я полагаю, что локус переносимости несколько отличается, но не знает, насколько ioctl_list(2) не говорит об этом аспекте индивидуальных методов ioctl.