Ключевая часть применяемой спецификации POSIX read()
выделена жирным шрифтом:
При попытке прочитать файл (кроме канала или FIFO) , который
поддерживает неблокирующие операции чтения и в настоящее время нет доступных данных:
Если установлено O_NONBLOCK
, read()
вернет -1
и установит errno
в [EAGAIN]
.
Если O_NONBLOCK
сброшено, read()
блокирует вызывающий поток до тех пор, пока не станут доступны некоторые данные.
Использование флага O_NONBLOCK
не действует, если имеются некоторые данные.
Базовая файловая система должна быть спроектирована и написана для поддержки неблокирующих операций чтения, и большинство файловых систем не делают этого для файлов.
Невозможно понять, почему разработчики файловых систем не написали много файловых систем, поддерживающих O_NONBLOCK
(если есть ...), но, скорее всего, потому что это бесполезно для файла. Файловые объекты имеют состояние - файловая система знает, есть ли доступные данные или нет, и нет внешней зависимости, если некоторые данные могут внезапно появиться таким образом, что это не повлияет на состояние файла.
Хотя «Вы прочитали весь файл» отличается от «В канале нет ничего (пока)», разница в информации, возвращаемой вызывающей стороне, не так велика.