Понимание прочитанного системного вызова - PullRequest
0 голосов
/ 05 октября 2018

Я читаю man read страницу справочника и обнаружил, что было возможно прочитать меньше необходимого количества байтов, переданных в качестве параметра:

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

У меня следующая ситуация:

  1. Какой-то процесс переместил файл в каталог, который я слушаю IN_MOVED_TO События inotify.
  2. Я получаю событие IN_MOVED_TO, открываю файл и начинаю читать его до достижения EOF
  3. Никакие другие процессы не изменяют перемещенный файл 1. (после перемещения он остается неизменнымвремя)

Гарантируется ли, что если read вернет число прочитанных байтов меньше, чем я запросил, то следующий вызов read вернет 0?Я имею в виду, что «чтение 1 000 000 000 одним байтом для файла гигабайта» запрещено документацией

1 Ответ

0 голосов
/ 05 октября 2018

Гарантируется ли, что если read вернет число прочитанных байтов меньше, чем я запросил, то следующий вызов read вернет 0?

Нет, не на практике.Это должно быть верно, если файловая система полностью совместима с POSIX, но многие из них - нет (в угловых случаях).В частности, NFS (см. nfs (5) ) и FUSE или proc (см. proc (5) ) не полностью соответствуют POSIX.

Поэтому на практике я настоятельно рекомендую обрабатывать «read возвращает меньшее количество байтов, чем требуется регистр», даже если вы правы, полагая, что этого не должно произойти.Обработка этого «невозможного» случая должна быть легкой для вас.

Обратите также внимание, что inotify (7) средства не работают с такими странными файловыми системами, как NFS, proc, FUSE, ... Подумайтетакже в угловых случаях, таких как внутри файловой системы Ext4 символическая ссылка на файл NFS;или привязать крепления и т.д ...

...