当前位置: 首页 > 面试题库 >

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

宋翔
2023-03-14
问题内容

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

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

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


问题答案:

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

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

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



 类似资料:
  • 本文向大家介绍java对同一个文件进行读写操作方法,包括了java对同一个文件进行读写操作方法的使用技巧和注意事项,需要的朋友参考一下 同一个文件是不可以进行同时的读写的,因为我们写入文件会覆盖原文件的,如果这样,对于同一文件来来说,文件发生覆盖,无法进行下次读取 当然,对于两个不同的文件,可以一边读一边写的操作 题目:一个文本中存储26个无序字母,要求对字母排序后重新写入该文件中 分析:可以在内

  • 我正在编写一个带有事务回滚的简单json数据库。我需要向一个文件追加一行文本,然后根据追加是否成功,将成功或失败记录到另一个文件。如果需要,第二个文件用于回滚。因此,在继续之前,我需要确定写操作是否成功。 我使用stream.write追加我的文本行,其中包括一个回调,应该验证写操作的成功或失败。 然后我在下面的URL上的NodeJS文档中读到了这个不幸的消息https://nodejs.org/

  • 本文向大家介绍java进行文件读写操作详解,包括了java进行文件读写操作详解的使用技巧和注意事项,需要的朋友参考一下 直接上代码,有详细注释,有图解,相信你懂得!    

  • 本文向大家介绍Java对xls文件进行读写操作示例代码,包括了Java对xls文件进行读写操作示例代码的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要给大家介绍的是关于Java对xls文件进行读写操作的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: win7_x64 IDEA Java读写xls文件,使用库jxl.jar 读写xls文件,这里是在知道表格格式的前提

  • 问题内容: 这是场景: ThreadA将要从某些套接字读取,并将数据写入“ MyFile.txt” ThreadB将读取“ MyFile”,到达末尾时,它将循环播放,直到MyFile中有新数据可用为止(因为我不想重新打开“ MyFile.txt”,并且浪费时间,所以我到达了从我所在的位置..)。 可以做这样的事情吗? 如果没有,还有其他方法可以做这种事情吗? 问题答案: 您提到的问题是著名的生产者

  • 问题内容: 我遇到了以下SYBASE SQL: 该SQL的结果是 这看起来像是将HAVING条件应用于行而不是组。有人可以帮我指出描述这种情况的地方是Sybase 15.5文档吗?我所看到的只是“在团队中运作”。我在文档中看到的最接近的是: hading子句可以包括不在选择列表中且不在group by子句中的列或表达式。 (从这里引用)。 但是,他们没有完全解释当您这样做时会发生什么。 问题答案: