Ответ 1
FIOASYNC
переключает флаг O_ASYNC
(который обычно устанавливается в open(2)
или fcntl(2)
) для файлового дескриптора, который просит ядро отправить SIGIO
или SIGPOLL
в процесс, когда дескриптор файла готов для ввода-вывода.
O_ASYNC
не используется часто:
- чрезвычайно сложно правильно обрабатывать IO в обработчиках сигналов; их лучше оставить как можно меньше
- поскольку сигналы прерывают поток управления программой, они "стоят больше" для запуска, чем стандартные системные вызовы, такие как
select(2)
илиpoll(2)
Сигналы - предоставляют меньше информации, чем другие вызовы: они сообщают только один fd ready и многие fds, которые могут быть готовы.
O_NONBLOCK
не предоставляет никакого уведомления пользовательскому процессу о том, что fd готов к read(2)
или write(2)
- вместо этого он изменяет поведение read(2)
и write(2)
и аналогичные вызовы немедленно вернитесь, если дескриптор файла не готов для чтения или записи. O_NONBLOCK
обычно используется в сочетании с select(2)
или poll(2)
или аналогичными вызовами, чтобы гарантировать, что основной цикл клиента или сервера не будет блокироваться на одном и, таким образом, голодают все его сверстники.