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

vy3*_*y32 5 memory-mapped-files ioerror

我正在修改一个当前打开文件并使用fread()读取它们以使用内存映射文件的工具。该程序经常从可能有I / O错误的设备读取数据。目前,我们使用fread()返回的错误来捕获这些错误。内存映射文件如何报告I / O错误?

Ole*_*nov 4

vy32 引用的 Linux 手册页明确指出,这是SIGSEGV写入失败时生成的(例如,没有磁盘空间),但尚不清楚读取失败是否会生成此类错误(例如,当可移动介质已被物理删除时)。维基百科似乎对此更具体:

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

POSIX 规范mmap不要求信号在错误时传递,但为实现留下了这样的可能性:

当引用会导致映射对象出现错误(例如空间不足的情况)时,实现可能会生成 SIGBUS 信号。