一尘不染

Unix是否以原子方式对单个文件进行读写操作?

linux

我想知道单个文件的写入是否原子完成,从而对同一文件的write(“ bla bla”)和随后的write(“ herp derp”)永远不会导致交织,例如“
bla herp bla derp ”。假设这些写操作发生在不同的进程或线程中,什么决定了哪个先完成?

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

我对并发文件访问策略不感兴趣。我只想知道读写操作到底能做什么。


阅读 294

收藏
2020-06-03

共1个答案

一尘不染

单独的write()调用是分开处理的,而不是作为单个原子写入事务处理的,并且当多个进程/线程正在向同一个文件写入时,交织是完全可能的。实际写入的顺序由调度程序(两个内核进程调度程序,对于“绿色”线程,则由线程库的调度程序)确定。

除非您另外指定(O_DIRECT
open标志或类似内容,如果支持),read()并且write()对内核缓冲区进行操作,并且read()将优先使用已加载的缓冲区来优先读取磁盘。

请注意,这可能会由于本地文件缓冲而变得复杂;例如,stdio并且iostreams将读取由块的文件数据到在该过程是独立内核缓冲区的缓冲器,所以一个write()从别处到在已经缓冲的数据stdio将不被看到。同样,在使用输出缓冲之前,在刷新输出缓冲区之前,不会自动有任何实际的内核级输出,要么是因为它已满,要么是自动填充的,或者是由于fflush()C
++ endl(隐式刷新输出缓冲区)而手动进行的。

2020-06-03