В чем разница между асинхронным и неблокирующим режимом в сокете unix? - PullRequest
17 голосов
/ 07 июня 2011

Я вижу такой код в 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 одним и тем же??

1 Ответ

17 голосов
/ 07 июня 2011

FIOASYNC переключает флаг O_ASYNC (который обычно устанавливается в open(2) или fcntl(2)) для файлового дескриптора, который попросит ядро ​​отправить SIGIO или SIGPOLL процессу, когдадескриптор файла готов к вводу-выводу.

O_ASYNC используется не часто:

  • крайне трудно правильно обрабатывать ввод-вывод в обработчиках сигналов;их лучше оставить как можно меньше
  • , потому что сигналы прерывают поток управления программой, они «обходятся дороже», чем стандартные системные вызовы, такие как select(2) или poll(2)
  • сигналы предоставляют меньше информации, чем другие вызовы: они сообщают только об одном fd ready против многих fd, которые могут быть готовы.

O_NONBLOCK не предоставляет каких-либо уведомленийпользовательский процесс, к которому готов fd для read(2) или write(2) - вместо этого он изменяет поведение read(2) и write(2) и аналогичные вызовы для немедленного возврата, если дескриптор файла не готов для чтения или записи.O_NONBLOCK обычно используется вместе с select(2) или poll(2) или аналогичными вызовами , чтобы гарантировать, что основной цикл клиента или сервера не будет блокироваться на одном конкретном одноранговом узле, и, таким образом, истощать все своисверстники.

...