Подтвердить что ты не робот

Какая разница между асинхронным и неблокирующим в unix-сокете?

Я вижу такой код в nginx:

if(fcntl(ngx_processes[s].channel[0], F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK) == -1) {
...
if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) {
...

Кто-нибудь может сказать мне, что разница между fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK) и ioctl(s, FIOASYNC, &on), не async и nonblocking то же самое?

4b9b3361

Ответ 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) или аналогичными вызовами, чтобы гарантировать, что основной цикл клиента или сервера не будет блокироваться на одном и, таким образом, голодают все его сверстники.