我正在使用一个程序qdbm http://sourceforge.net/projects/qdbm/维护键值存储(qdbm 链接到程序中)。在某些情况下,该进程会在 qdbm 数据库中放入一个值,然后通过调用外部 init 脚本(通过 system())自行重新启动。看来有时写入 qdbm 数据库的值实际上并没有保留,我想知道这是否可能是由于在通过 SIGTERM 终止进程之前数据没有刷新到磁盘。
由于 qdbm 确实使用 write() 系统调用进行写入(相对于 fwrite() 库函数),我认为 Linux 内核应该知道最终将所有内容刷新到磁盘(系统不会重新启动,只是进程)。此外,在进程被终止之前,close() 确实会在 FD 上被调用。
那么,我的理解是否正确,或者我是否需要在某处添加一些 fdatasync() 或类似的调用?此处有关语义的权威参考文献的链接也将受到赞赏。
通常,应用程序已经将数据写入内核缓冲区write()
不会受到应用程序退出或以任何方式被终止的影响。退出或被杀死会隐式关闭所有文件描述符,因此应该没有区别,内核将在之后处理刷新。所以不行fdatasync()
或类似的细胞是必要的。
有两个例外:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)