По крайней мере в POSIX (включая Linux) очевидный ответ заключается в том, что обычные неблокирующие файлы не существуют. Обычные файлы ВСЕГДА блокируются, а O_NONBLOCK молча игнорируется.
Аналогично, poll () / select () et al. всегда сообщит вам, что fd, указывающий на обычный файл, готов к вводу / выводу, независимо от того, готовы ли данные в кеше страницы или еще на диске (в основном релевантны для чтения).
EDIT И, поскольку O_NONBLOCK не используется для обычных файлов, read () для обычного файла никогда не установит errno в EAGAIN, в отличие от того, что утверждает другой ответ на этот вопрос.
РЕДАКТИРОВАТЬ2 Ссылки:
В спецификации POSIX (p) выберите () : «Файловые дескрипторы, связанные с обычными файлами, должны всегда выбирать true для условий готовности к чтению, готовности к записи и ошибок».
Из спецификации POSIX poll () : «Обычные файлы всегда должны опрашивать ИСТИНА для чтения и записи».
Вышеприведенного достаточно для того, чтобы подразумевать, что, хотя, возможно, и не строго запрещено, неблокирование обычных файлов не имеет смысла, так как не было бы никакого способа опросить их, кроме ожидания занятости.
Помимо вышесказанного, есть хотя бы некоторые косвенные доказательства
Из спецификации POSIX open () : Определяется поведение файловых дескрипторов, относящихся к каналам, блочным специальным файлам и символьным специальным файлам. «В противном случае поведение O_NONBLOCK не определено.»
Некоторые ссылки по теме:
http://tinyclouds.org/iocp-links.html
http://www.remlab.net/op/nonblock.shtml
http://davmac.org/davpage/linux/async-io.html
И даже здесь, на stackoverflow:
Может ли обычное чтение файлов получить пользу от неблокирующего ввода-вывода?
Как указывает ответ Р., из-за того, как работает кэширование страниц, неблокирование обычных файлов не очень легко определить. Например. Что если по какому-то механизму вы обнаружите, что данные готовы для чтения в кеше страниц, а затем, прежде чем читать, ядро решает выкинуть эту страницу из кеша из-за нехватки памяти? Это отличается для таких вещей, как сокеты и каналы, потому что правильность требует, чтобы данные не отбрасывались просто так
Кроме того, как бы вы выбрали / опросили для поиска дескриптора файла? Вам понадобится новый API, который будет поддерживать указание диапазона байтов в интересующем вас файле. И реализация этого API в ядре будет привязана к системе VM, так как это предотвратит интересующие вас страницы. быть выгнанным Что означало бы, что эти страницы будут учитываться при ограничении заблокированных страниц процесса (см. Ulimit -l), чтобы предотвратить DOS. И когда эти страницы будут разблокированы? И так далее.