究竟何时可以读取写入文件的数据?

时间:2018-08-03 19:32:35

标签: linux file io buffer posix

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.

“证明发生”在这里到底是什么意思?如果进程1 write的数据到达ext4文件系统上的文件描述符,并且进程2在read返回之后立即在同一文件上调用write,这是否意味着进程2得到了保证获取由进程1写入的数据?

1 个答案:

答案 0 :(得分:1)

POSIX wording至少在单独的流程部分上更加清晰:

  

如果可以证明(通过任何方式)在数据的write()之后发生了文件数据的read(),则即使调用是由不同的进程进行的,它也必须反映出write()。 >

证明基本上只是意味着您可以证明订单不是随心所欲的(由于竞赛条件)。

如果进程2恰好在写发生后立即调用read,则从技术上讲不能保证获取数据。

但是,如果进程1写了些东西然后切换了互斥锁,发送了信号,或者执行了进程2在读取之前可能直接或间接观察到的任何类型的操作(即使它只是观察到由自己写),则需要read返回该写数据。

我不知道在实践中是否/如何利用这种区别,但这确实意味着操作系统可以合并两个连续的写操作,而不必为任何偶然读入的人提供中间结果他们中间。