3

我想知道是否有 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 可见,或者操作系统是否可以缓存写入以使其不会及时传播?我们可以假设没有其他进程知道文件名或以其他方式破坏文件查找。

4

1 回答 1

2

是的。例如来自 write() 规范(http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html):

对常规文件的 write() 成功返回后:

    从文件中被该写入修改的每个字节位置的任何成功 read() 都应返回 write() 为该位置指定的数据,直到再次修改此类字节位置。

    对文件中相同字节位置的任何后续成功 write() 都将覆盖该文件数据。

请注意,它表示“任何”read(),即您可以通过它打开()一个新的 fd 和 read(),并且提供了相同的保证。

顺便说一句,虽然这种强一致性使得语义推理变得容易,但它也使得提供具有良好性能的 POSIX 兼容分布式 FS 非常困难,如果不是不可能的话。

于 2012-04-03T10:24:21.817 回答