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