Что происходит, когда вы создаете файл, записываете в него и затем читаете его? - PullRequest
0 голосов
/ 30 декабря 2018

Вот сценарий:

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

Таким образом, файл был создан и записан, но не очищен или не закрыт.

Для POSIX / Linux...

Я предполагаю, что дескриптор, возвращаемый при втором открытии, может использоваться для чтения содержимого, записанного в первый открытый дескриптор.Это так?

При втором открытии также происходит сброс?

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Ответ на первый вопрос из руководства по POSIX:

После успешного возврата write() в обычный файл:

Любое успешное read() с каждой позиции байта вфайл, который был изменен этой записью, должен возвращать данные, заданные write() для этой позиции, до тех пор, пока такие байтовые позиции не будут снова изменены.

Для второго вопроса нет необходимости в очистке... Все, что было написано, находится в руках ядра, поэтому любое чтение может иметь к нему доступ, если этого требует стандарт.Flush обычно предназначен для передачи данных из буфера пользовательского пространства в пространство ядра (или что-то в руках).Теперь, если вы имеете в виду сброс на диск, для этого нет никаких требований ...

0 голосов
/ 30 декабря 2018

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

Вот комментарий к спецификации:

"То есть записи должны быть строго согласованными, то есть write () требуется для блокировки приложениявыполнение до тех пор, пока система не сможет гарантировать, что любой другой вызов read () увидит только что записанные данные "(ref: https://www.nextplatform.com/2017/09/11/whats-bad-posix-io/)

. Возникает вопрос, какова цель flush ()Если каждая запись фиксирует данные перед возвратом? Я вижу, что это, кажется, недоразумение с моей стороны - поскольку POSIX имеет fflush () (не flush) и fflush () применяется к потокам, а не к файлам.

FYI myпутаница возникла из-за того, что я предполагал, что операторы FUSE отображаются на файловые операции POSIX, а у FUSE есть оператор сброса, поэтому я предполагаю, что FUSE не обязательно соответствует POSIXмуравей написать ()?Это имеет смысл разрешить некоторым реализациям FUSE возвращаться до фиксации данных, если это нецелесообразно (например, по соображениям производительности).Я размышляю там, поэтому любые комментарии по этому поводу будут оценены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...