читать () из файла вернуть что? - PullRequest
0 голосов
/ 09 мая 2018

во всех ссылках ниже:

http://pubs.opengroup.org/onlinepubs/9699919799/

https://linux.die.net/man/3/read

это говорит:

При попытке прочитать файл (кроме канала или FIFO), который поддерживает неблокирующее чтение и не имеет доступных данных:

Если установлено значение O_NONBLOCK, read () возвращает -1 и устанавливает errno равным [EAGAIN].

Если O_NONBLOCK очищен, read () блокирует вызывающий поток до некоторые данные становятся доступными.

Использование флага O_NONBLOCK не имеет эффекта, если есть некоторые данные имеется.

Но кто на самом деле это пробует? Как я проверял, все вышеперечисленные случаи позволили read () вернуть 0.

Кажется, что O_NONBLOCK не работает, независимо от того, настроил ли я его так:

int flags = O_RDONLY;
int mode = S_IRGRP|S_IROTH|S_IRUSR;
int _pbfd = (::open)("123",flags,mode);

Или вот так:

int _pbfd = (::open)("123",flags,mode);
int saved_flags = fcntl(_pbfd, F_GETFL);
fcntl(_pbfd, F_SETFL, saved_flags & ~O_NONBLOCK);

1 Ответ

0 голосов
/ 09 мая 2018

Ключевая часть применяемой спецификации POSIX read() выделена жирным шрифтом:

При попытке прочитать файл (кроме канала или FIFO) , который поддерживает неблокирующие операции чтения и в настоящее время нет доступных данных:

  • Если установлено O_NONBLOCK, read() вернет -1 и установит errno в [EAGAIN].

  • Если O_NONBLOCK сброшено, read() блокирует вызывающий поток до тех пор, пока не станут доступны некоторые данные.

  • Использование флага O_NONBLOCK не действует, если имеются некоторые данные.

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

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

Хотя «Вы прочитали весь файл» отличается от «В канале нет ничего (пока)», разница в информации, возвращаемой вызывающей стороне, не так велика.

...