2011-10-22 117 views
0

如何在数据已成功回拨的情况下回拨在Linux中写入磁盘?写入磁盘回调的数据

我想将我的程序db文件映射到内存中进行读/写操作,并在写入成功命中磁盘后接收回调。有点像旧的VMSs曾经做过的事情..

+0

您能否提供更多关于您已经尝试的内容以及您遇到问题的部分代码?在目前的形式下,这个问题可能会得到一个简单的“是”或“否”的答案。 – chown

+0

我还没有尝试过任何东西。我正在寻找一种方法来确认数据实际上已被提交到磁盘。我研究过DBMS日志记录技术,但如果可能的话,我想尽量避免这种路径...希望操作系统发出一个信号,告诉我已经完成将这个块写入磁盘。有这样的事吗? – gamedynamix

+0

无论如何,您可能需要使用日志记录 - 在发出写入和同步完成时,如果系统在此刻断电,则正在写入(甚至部分)任何数据块可能会完全丢失。 – bdonlan

回答

3

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

你可以从另一个线程做到这一点,但是如果一个线程在另一个线程正在执行fdatasync()时写入该文件,那么将不清楚哪个写入保证是持久的或不是。

想要以保证持久的方式存储事务日志的数据库需要调用fdatasync。数据库(如innodb)通常在其主数据文件中使用直接IO(以及它们自己的数据缓存,而不是依赖于操作系统),以便他们知道它将以可预测的方式写入。

+0

这是正确的。如果你想要一个回调函数,只需使用一个执行写操作的线程,调用'fdatasync()'/'msync()'或类似函数,然后调用你的回调函数。 – caf

+0

我不确定“简单”如何适用于此。有一个线程进行回调可能不是OP想要的。 – MarkR

1

据我所知,当文件(或mmap ed区域)发生实际同步时,甚至不是文件的时间戳将要改变。但是,您可以使用fsync强制执行文件(或区域)的同步。

也很难看出你为什么要这样做的原因。文件IO应该是不透明的。

+1

mmh ..我可以看到很多原因。 –

+0

我需要它的原因是,一旦写入磁盘已被确认,我需要生成客户收据。不能承受一个数据写入磁盘的数据无法打开收据.. – gamedynamix

+0

@gamedynamix我建议你只要做你的写和调用'fsync'这种方式,你可以确信数据被写入并生成您的收据。 – pmr