Нужно ли открывать файловый дескриптор, используемый в POSIX AIO, с помощью `O_NONBLOCK` в` open () `? - PullRequest
0 голосов
/ 31 августа 2018

При использовании POSIX AIO с дескриптором файла, нужно ли открывать дескриптор файла с помощью O_NONBLOCK в open()?

В APUE я не нахожу явного ответа «да» или «нет», но я не считаю, что такой дескриптор файла открывается с O_NONBLOCK в open() в одном примере.

Спасибо.

1 Ответ

0 голосов
/ 31 августа 2018

Поскольку вы комментируете, что вам неясны отношения и различия между неблокирующим вводом / выводом и асинхронным вводом / выводом:

  • Операции ввода-вывода для файла, открытого в неблокирующем режиме, не блокируются, даже если данные не могут быть переданы немедленно. Если они передают меньше данных, чем было запрошено (или вообще не отправлено), то вызывающий абонент может повторить попытку позже, если пожелает. Ничего не стоит в очереди для дальнейших действий.

  • Интерфейс POSIX AIO обеспечивает выполнение операций ввода-вывода асинхронно относительно потока вызывающей стороны. Вызовы AIO возвращаются без ожидания ввода-вывода, , пока выполняется попытка ввода-вывода в другом контексте выполнения . Вызывающий может договориться о том, чтобы различными способами получать уведомление о завершении операции (или нет). А пока он может выполнять любую другую работу, какую захочет.

Между ними нет особой связи. Ни спецификации POSIX, такие как для aio_read(), ни руководство Linux для интерфейсов POSIX AIO не содержат каких-либо требований, чтобы файл, на котором выполняется AIO, был неблокирующим режим, и при этом они не определяют условия ошибки для случая, когда он находится в режиме блокировки. Неблокирующий режим не является обязательным.

Действительно, хотя это разрешено, было бы даже не особенно полезно выполнять AIO для неблокирующего файла. Если вы можете полагаться на то, что ваша операция не блокируется, то что вы получите от ее асинхронного выполнения? Суть AIO заключается в том, что вызывающему абоненту не нужно ждать, но ввод / вывод выполняется.

...