Являются ли операции ввода-вывода Posix с именами файлов последовательными?

Я хотел бы знать, существует ли стандартная гарантия Posix, что изменения в файле гарантированно будут видны через повторные вызовы open/close для одного и того же имени файла. Для демонстрации рассмотрим этот сценарий Bash:

#!/bin/bash

FILE=$(mktemp)

echo "Some data" >> $FILE
cat $FILE

Гарантируется ли, что к моменту завершения echo все данные будут доступны в файле?

С точки зрения функций Posix пример может быть таким:

const char fn[] = "/tmp/somefile";
const char data[] = "hello world";

// Stage 1
{
   int fd = open(fn, O_CREAT);
   write(fd, data, sizeof data); // #1
   close(fd);
}

// Stage 2
{
   int fd = open(fn);
   read(fd, ...);                // #2
   close(fd);
}

Гарантируется ли, что запись в строке № 1 видна для чтения № 2, или ОС может кэшировать запись, чтобы она не распространялась во времени? Мы можем предположить, что ни один другой процесс не знает имя файла или иным образом не искажает поиск файла.


person Kerrek SB    schedule 03.04.2012    source источник
comment
На close(2) справочной странице Linux: не проверять возвращаемое значение close( ) является распространенной, но тем не менее серьезной ошибкой программирования. Вполне возможно, что об ошибках предыдущей операции записи(2) сначала сообщается при финальном закрытии(). Отсутствие проверки возвращаемого значения при закрытии файла может привести к скрытой потере данных.   -  person Luca Martini    schedule 03.04.2012
comment
@LucaMartini: Как это повлияет на сценарий Bash? Можно ли проверить успешность операции с трубой? Кроме того, гарантирует ли согласованность успешное возвращение close?   -  person Kerrek SB    schedule 03.04.2012
comment
Я имел в виду пример, а не сценарий. Возможно, можно также проверить возвращаемое значение echo "Some data" >> $FILE. Я не нашел никаких подсказок в стандарте POSIX, кроме вызова fflush, который также присутствует в стандарте C.   -  person Luca Martini    schedule 03.04.2012


Ответы (1)


Да. Например. из спецификации write() ( http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html):

After a write() to a regular file has successfully returned:

    Any successful read() from each byte position in the file that was modified by that write shall return the data specified by the write() for that position until such byte positions are again modified.

    Any subsequent successful write() to the same byte position in the file shall overwrite that file data.

Обратите внимание, что он говорит «Любой» read(), т. е. вы можете открыть () новый fd и прочитать () через него, и предоставляются те же самые гарантии.

Между прочим, в то время как такая строгая согласованность позволяет легко рассуждать о семантике, она также делает создание распределенной FS, совместимой с POSIX, с достойной производительностью, очень трудным, если не невозможным.

person janneb    schedule 03.04.2012
comment
Так, например, будет ли Linux строго совместим с Posix в этом отношении? - person Kerrek SB; 03.04.2012
comment
@KerrekSB: насколько я знаю, для обычных локальных файловых систем да. Сетевые/распределенные/кластерные/любые FS часто используют ярлыки во имя производительности, хотя на самом деле это не должно рассматриваться в рамках одного клиента, а только как несогласованность между клиентами. - person janneb; 03.04.2012
comment
@KerrekSB: Представьте, что приложение выполняет write(), а затем read() с одним и тем же смещением файла. Если read() не возвращает только что записанные данные, это будет полностью сломанное ядро, не так ли? - person Maxim Egorushkin; 03.04.2012
comment
@MaximYegorushkin: Если мы говорим об одном файловом дескрипторе, то я полностью согласен. Но я спрашиваю о двух потенциально совершенно не связанных этапах. У вас есть какие-то гарантии на этот счет? - person Kerrek SB; 03.04.2012
comment
@KerrekSB: такое поведение требуется POSIX. Linux man write(2) говорит: POSIX требует, чтобы чтение(2), которое может быть доказано после возврата из записи(), возвращало новые данные. Обратите внимание, что не все файловые системы соответствуют стандарту POSIX. - person Maxim Egorushkin; 03.04.2012
comment
@MaximYegorushkin: Хорошо, круто. Как насчет реальных файловых систем? Совместима ли ext3fs с Posix? :-) - person Kerrek SB; 03.04.2012
comment
@KerrekSB: Да, все ext[2,3,4]fs совместимы с POSIX, как и XFS, и btrfs, и другие. Хотя баги, конечно, возможны. - person janneb; 03.04.2012