Unix是否读取和写入原子序列化的单个文件?

时间:2011-03-05 01:06:01

标签: linux file unix

我想知道单个文件上的写入是否以原子方式完成,使得对同一文件的写入(“bla bla”)和后续写入(“herp derp”)不会导致交错,例如, “bla herp bla derp”。假设这些写入发生在不同的进程或线程中,那么先控制哪些进程?

此外,read()是否始终返回反映文件的数据,该文件处于所有先前写入完全完成的状态(数据是否已实际写入磁盘)?例如,在写入(“herp derp”)之后,所有后续读取将始终反映写入文件的完整数据,或者后续读取是否有时仅反映“herp”而不反映“derp”(或有时不反映任何数据)在所有)?如果读写在不同的进程/线程中发生怎么办?

我对并发文件访问策略不感兴趣。我只想知道读写的内容。

1 个答案:

答案 0 :(得分:10)

单独处理单独的write()调用,而不是单个原子写入事务,并且当多个进程/线程写入同一文件时完全可以进行交错。实际写入的顺序由调度程序(内核进程调度程序和线程库调度程序的“绿色”线程)决定。

除非您另行指定(O_DIRECT open标记或类似标记(如果支持),read()write()对内核缓冲区进行操作,read()将使用加载缓冲区优先于再次读取磁盘。

请注意,本地文件缓冲可能会使这一点变得复杂;例如,stdioiostreams将按块读取文件数据到进程中的缓冲区,该缓冲区独立于内核缓冲区,因此从其他位置write()到已缓存在{ {1}}将不会被看到。同样,对于输出缓冲,在刷新输出缓冲区之前不会有任何实际的内核级输出,因为它已经填满或由于stdio或C ++的fflush()而被手动填充(隐式刷新)输出缓冲区。)