В каждом примере и обсуждении, с которыми я сталкиваюсь в контексте программирования сокетов 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
методов.
источник
Как сказал @Sean,
fcntl()
он в значительной степени стандартизирован и поэтому доступен на всех платформах.ioctl()
Функция предшествуетfcntl()
в Unix, но не стандартизирована. Кioctl()
счастью, это сработало для вас на всех актуальных для вас платформах, но это не гарантируется. В частности, имена, используемые для второго аргумента, являются загадочными и ненадежными для разных платформ. Действительно, они часто уникальны для конкретного драйвера устройства, на который ссылается файловый дескриптор. (ioctl()
Вызовы, использованные для устройства с растровой графикой, работающего на ICL Perq под управлением PNX (Perq Unix) двадцать лет назад, никогда не переводились, например, ни на что другое.)источник
Я считаю,
fcntl()
что это функция POSIX. Гдеioctl()
это стандартная вещь UNIX. Вот список POSIX io .ioctl()
это очень специфичная вещь для ядра / драйвера / ОС, но я уверен, что то, что вы используете, работает с большинством разновидностей Unix. некоторые другиеioctl()
вещи могут работать только с определенной ОС или даже с определенными версиями ее ядра.источник