内存映射文件如何处理I/O错误?

7

我正在修改一个工具,目前它使用fread()打开文件并读取文件。我想要使用内存映射文件来替代它。这个程序经常从可能存在I/O错误的设备中读取数据。目前我们通过捕获fread()返回的错误来处理这些错误。那么内存映射文件会如何报告I/O错误呢?


这肯定取决于你的操作系统。*nix的mmap()函数与Windows的内存映射文件实现方式是不同的。 - hippietrail
我认为Windows甚至没有SIGSEGVSIGBUS,但我可能错了。我非常确定他们甚至没有mmap(),而是采用了完全不同的设计系统。但如果这些假设是错误的,我很乐意接受更正。 - hippietrail
3
Windows没有mmap,但有几乎相同的CreateFileMapping函数。我曾在不同平台上几乎可以互换地使用这两个函数。在Windows下也有SIGSEGV,请参考http://msdn.microsoft.com/en-us/library/xdkz3x12(v=vs.71).aspx。 - vy32
2个回答

3
Linux man page 中提到,vy32明确指出SIGSEGV在写入失败(例如没有磁盘空间)时生成,但不清楚读取失败是否会生成此类错误(例如当可移动介质已被物理拆除)。 Wikipedia 在这方面似乎更具体:

在访问映射内存时,底层文件的I/O错误(例如其可移动驱动器已拔出或光学介质已弹出,写入时磁盘已满等)将作为POSIX上的SIGSEGV/SIGBUS信号和Windows上的EXECUTE_IN_PAGE_ERROR结构化异常报告给应用程序。所有访问映射内存的代码都必须准备好处理这些错误,这些错误通常不会在访问内存时发生。

mmap的POSIX规范 不要求在错误时传递信号,但为实现留下了这种可能性。
实现可能会在引用将导致映射对象中的错误(例如空间不足)时生成SIGBUS信号。

1

好的,看起来当尝试访问不可用的映射内存时会生成SIGSEGV或SIGBUS


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接