gpt4 book ai didi

linux - 如果进程被终止,写入 write() 的数据是否会刷新到磁盘?

转载 作者:太空宇宙 更新时间:2023-11-04 04:09:58 25 4
gpt4 key购买 nike

我正在使用一个使用 qdbm 的程序维护键值存储(qdbm 链接到程序中)。在某些情况下,该进程会在 qdbm 数据库中放入一个值,然后通过调用外部初始化脚本(通过 system())自行重新启动。看来有时写入 qdbm 数据库的值实际上并没有保留,我想知道这是否可能是由于在通过 SIGTERM 终止进程之前数据没有刷新到磁盘。

由于 qdbm 使用 write() 系统调用进行写入(相对于 fwrite() 库函数),我认为 Linux 内核应该知道最终将所有内容刷新到磁盘(系统不会重新启动,只是进程)。另外,在进程被终止之前,close() 确实会在 FD 上被调用。

那么,我的理解是否正确,或者我是否需要在某处添加一些 fdatasync() 或类似的调用?此处有关语义的权威引用文献的链接也将受到赞赏。

最佳答案

通常,应用程序已使用 write() 写入内核缓冲区的数据不会受到应用程序退出或以任何方式被终止的影响。退出或被杀死会隐式关闭所有文件描述符,因此应该没有区别,内核将在之后处理刷新。因此不需要 fdatasync() 或类似的调用。

有两个异常(exception):

  • 如果应用程序使用用户态缓冲(不调用 write() 系统调用,而是使用 fwrite() 将数据缓存在用户空间缓冲区中),除非执行正确的用户空间文件关闭,否则这些缓冲区可能不会被刷新 - 被 SIGKILL 杀死肯定会导致您丢失这些缓冲区的内容,

  • 如果内核也死掉(断电、内核崩溃等),您的数据可能会错过从内核缓冲区写入磁盘的机会,然后就会丢失。

关于linux - 如果进程被终止,写入 write() 的数据是否会刷新到磁盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19647997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com