我想知道单个文件上的写入是否以原子方式完成,使得对同一文件的写入(“bla bla”)和后续写入(“herp derp”)不会导致交错,例如, “bla herp bla derp”。假设这些写入发生在不同的进程或线程中,那么先控制哪些进程?
此外,read()是否始终返回反映文件的数据,该文件处于所有先前写入完全完成的状态(数据是否已实际写入磁盘)?例如,在写入(“herp derp”)之后,所有后续读取将始终反映写入文件的完整数据,或者后续读取是否有时仅反映“herp”而不反映“derp”(或有时不反映任何数据)在所有)?如果读写在不同的进程/线程中发生怎么办?
我对并发文件访问策略不感兴趣。我只想知道读写的内容。
答案 0 :(得分:10)
单独处理单独的write()
调用,而不是单个原子写入事务,并且当多个进程/线程写入同一文件时完全可以进行交错。实际写入的顺序由调度程序(内核进程调度程序和线程库调度程序的“绿色”线程)决定。
除非您另行指定(O_DIRECT
open
标记或类似标记(如果支持),read()
和write()
对内核缓冲区进行操作,read()
将使用加载缓冲区优先于再次读取磁盘。
请注意,本地文件缓冲可能会使这一点变得复杂;例如,stdio
和iostreams
将按块读取文件数据到进程中的缓冲区,该缓冲区独立于内核缓冲区,因此从其他位置write()
到已缓存在{ {1}}将不会被看到。同样,对于输出缓冲,在刷新输出缓冲区之前不会有任何实际的内核级输出,因为它已经填满或由于stdio
或C ++的fflush()
而被手动填充(隐式刷新)输出缓冲区。)