【问题标题】:Data written to disk callback数据写入磁盘回调
【发布时间】:2011-12-13 08:24:53
【问题描述】:

在 Linux 中将数据成功写入磁盘后,如何获得回调?

我想将我的程序数据库文件映射到内存中以进行读/写操作,并在写入成功命中磁盘后接收回调。有点像旧的 VMS 过去所做的......

【问题讨论】:

  • 您能否提供更多关于您已经尝试过的内容以及您遇到问题的代码部分的详细信息?在目前的形式下,这个问题可能会得到一个简单的“是”或“否”的答案。
  • 我还没有尝试过任何东西。我正在寻找一种程序方法来确认数据实际上已提交到磁盘。我已经研究过 DBMS 日志技术,但如果可能的话,我想避免走这条路……希望操作系统发出一个信号,说我已经完成了将这个块写入磁盘。有这种事吗?
  • 无论如何您可能都需要使用日志记录 - 在您发出写入操作和同步完成之间,如果系统此时断电,任何正在写入(甚至是部分写入)的数据块都可能完全丢失.

标签: c++ linux unix


【解决方案1】:

您需要调用 fdatasync(如果您确实还需要同步元数据,则需要调用 fsync)并等待它返回。

您可以从另一个线程执行此操作,但如果一个线程写入文件而另一个线程正在执行 fdatasync(),则不清楚哪些写入可以保证是持久的。

想要以保证持久的方式存储事务日志的数据库,需要调用 fdatasync。

数据库(例如 innodb)通常在其主要数据文件上使用直接 IO(以及它们自己的数据缓存,而不是依赖于操作系统),以便它们知道它将以可预测的方式写入。

【讨论】:

  • 这是正确的。如果您想要回调,只需使用执行写入的线程,调用 fdatasync() / msync() 或类似名称,然后调用您的回调。
  • 我不确定“简单”如何真正适用于此。让线程执行回调可能不是 OP 想要的。
【解决方案2】:

据我所知,当文件(或mmaped 区域)之间发生实际同步时,您无法收到任何通知,甚至文件的时间戳也不会更改。但是,您可以使用fsync 强制同步文件(或区域)。

也很难找到您想要这样做的原因。文件 IO 应该是不透明的。

【讨论】:

  • mmh.. 我可以看到很多原因。
  • 我需要它的原因是,一旦写入磁盘得到绝对确认,我需要生成客户收据。无法承受因无法写入磁盘的数据而公开收据的机会。..
  • @gamedynamix 我建议您直接写信并致电fsync,这样您就可以确保数据已写入并生成收据。
猜你喜欢
  • 2012-01-15
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 2018-05-23
  • 2013-01-02
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多