c++ - 如果进程崩溃,映射文件会怎样?

标签 c++ c linux windows macos

这在 OSX、Windows 和 Linux 之间可能有不同的答案。

如果进程崩溃,假设它没有崩溃,mmap 中的脏页最终是否会被操作系统丢弃或写出?

很明显,如果另一个进程映射了它们,它们仍然存在,但是如果崩溃的进程是唯一的呢?我对文档中的技术 promise 和实现的实际作用都感兴趣。如果您只知道一种操作系统,请仅针对该操作系统进行回复。

最佳答案

对于 Windows,我认为脏页最终会写入磁盘是毫无疑问的。明确记录了取消映射文件 View 不会刷新数据,但数据将像任何缓存一样延迟写入磁盘。 FlushViewOfFile 强制立即写入,但调用它是可选的。

有一些可能或许多不相关的异常(exception)情况。即使一个程序异常终止,文件的两个映射 View 也能保证保持一致,但这种一致性不会扩展到远程文件或使用 ReadFile/WriteFile 同时访问的文件。

文档没有提供明确的答案,但也没有暗示相反的情况可能是正确的。我会依赖,但需要经过测试。


正如链接中所指出的,如果存在机器故障的风险,最好确保页面在写入时被刷新。刷新缓存的内核可能会延迟一段时间。

关于c++ - 如果进程崩溃,映射文件会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25172393/

相关文章:

linux - 为什么 cat/dev/random 输出会改变?

c - 如何从源代码编译我自己的glibc C标准库并使用它?

c# - 尝试在 SmartDevice 项目中使用 PInvoke 时出现 MissingMethodException

c++ - 如何编译 C++ 代码并将其与已编译的 C 代码链接?

c - 如何在 gcc 中清除屏幕?

c - 我应该使用 #include <file.h> 还是 "file.h"?

linux - 如何在 centos 中为守护进程生成核心转储?

c++ - MSSQL C++ 连接器

c++ - 构建一个 vector 以允许未初始化的存储

c++ - 使用 iptables 共享来自两个不同连接的 Internet 连接