6

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

4

2 回答 2

3

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

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

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

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

于 2019-01-25T18:55:18.897 回答
1

好的,当尝试访问不可用的映射内存时,似乎生成了SIGSEGV 或 SIGBUS 。

于 2011-07-25T01:39:09.840 回答