Последовательны ли операции ввода-вывода Posix для имен файлов? - PullRequest
3 голосов
/ 03 апреля 2012

Я хотел бы знать, существует ли стандартная гарантия 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, или операционная система может кэшировать запись, чтобы она не распространялась во времени?Мы можем предположить, что никакой другой процесс не знает имя файла или иным образом подрывает поиск файла.

1 Ответ

2 голосов
/ 03 апреля 2012

Да.Например, из спецификации 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 и читать () черези те же гарантии предоставляются.

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

...