Почему Posix File I / O всегда блокируется? - PullRequest
0 голосов
/ 06 июня 2019

Из справочных страниц

O_NONBLOCK or O_NDELAY  
        This flag has no effect for regular files and block
          devices; that is, I/O operations will (briefly) block when
          device activity is required, regardless of whether O_NONBLOCK
          is set.  Since O_NONBLOCK semantics might eventually be
          implemented, applications should not depend upon blocking
          behavior when specifying this flag for regular files and block
          devices.

С мой вопрос У меня было следующее понимание системы io.

             Device <-----> Kernel Buffers <----->  Process

Таким образом, всякий раз, когда буферы заполнены (запись) или пусты (чтение), соответствующая команда из процесса может блокироваться или нет в зависимости от установленного выше флага. Ядро, взаимодействующее с устройством, не блокирует процесс. Ядро может использовать или не использовать DMA для связи с устройством.

Но похоже, что мое понимание неверно, так как я не понимаю, почему обычные файловые дескрипторы не могут быть неблокирующими. Может ли кто-нибудь помочь мне здесь?

1 Ответ

3 голосов
/ 06 июня 2019

«Блокировка» определяется как ожидание, когда файл станет доступным для чтения или записи.

Обычные файлы всегда доступны для чтения и / или записи;другими словами, всегда можно попытаться запустить операцию чтения / записи без необходимости ждать какого-либо внешнего события:

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