写入文件的数据究竟何时可供读取?
Exactly when is data that is written to a file available for reading?
write
的手册页指出:
POSIX requires that a read(2) which can be proved to occur after a
write() has returned returns the new data. Note that not all filesys‐
tems are POSIX conforming.
这里的"proved to occur"到底是什么意思?如果进程 1 write
将数据写入 ext4 文件系统上的文件描述符,并且进程 2 在 write
returns 之后立即对同一文件调用 read
,这是否意味着进程2保证能拿到进程1写入的数据?
POSIX wording稍微更清楚一点,至少在单独的过程部分:
If a read() of file data can be proven (by any means) to occur after a write() of the data, it must reflect that write(), even if the calls are made by different processes.
证明基本上只是意味着您可以证明顺序不是任意的(由于竞争条件)。
如果进程 2 碰巧在写入发生后立即调用 read
,那么从技术上讲不能保证获取数据。
但是,如果进程 1 写了一些东西,然后切换了一个互斥量,发送了一个信号,或者执行了进程 2 在读取之前可能直接或间接观察到的任何类型的操作(即使它只是观察到文件大小的变化导致由写入本身),那么 read
需要 return 写入的数据。
我不知道 if/how 这种区别在实践中得到了利用,但它确实意味着 OS 可以合并两个顺序写入而不必注意提供中间结果给任何刚好在他们中间阅读的人。
write
的手册页指出:
POSIX requires that a read(2) which can be proved to occur after a
write() has returned returns the new data. Note that not all filesys‐
tems are POSIX conforming.
这里的"proved to occur"到底是什么意思?如果进程 1 write
将数据写入 ext4 文件系统上的文件描述符,并且进程 2 在 write
returns 之后立即对同一文件调用 read
,这是否意味着进程2保证能拿到进程1写入的数据?
POSIX wording稍微更清楚一点,至少在单独的过程部分:
If a read() of file data can be proven (by any means) to occur after a write() of the data, it must reflect that write(), even if the calls are made by different processes.
证明基本上只是意味着您可以证明顺序不是任意的(由于竞争条件)。
如果进程 2 碰巧在写入发生后立即调用 read
,那么从技术上讲不能保证获取数据。
但是,如果进程 1 写了一些东西,然后切换了一个互斥量,发送了一个信号,或者执行了进程 2 在读取之前可能直接或间接观察到的任何类型的操作(即使它只是观察到文件大小的变化导致由写入本身),那么 read
需要 return 写入的数据。
我不知道 if/how 这种区别在实践中得到了利用,但它确实意味着 OS 可以合并两个顺序写入而不必注意提供中间结果给任何刚好在他们中间阅读的人。