我正在修改一个工具,目前它使用fread()打开文件并读取文件。我想要使用内存映射文件来替代它。这个程序经常从可能存在I/O错误的设备中读取数据。目前我们通过捕获fread()返回的错误来处理这些错误。那么内存映射文件会如何报告I/O错误呢?
我正在修改一个工具,目前它使用fread()打开文件并读取文件。我想要使用内存映射文件来替代它。这个程序经常从可能存在I/O错误的设备中读取数据。目前我们通过捕获fread()返回的错误来处理这些错误。那么内存映射文件会如何报告I/O错误呢?
SIGSEGV
在写入失败(例如没有磁盘空间)时生成,但不清楚读取失败是否会生成此类错误(例如当可移动介质已被物理拆除)。 Wikipedia 在这方面似乎更具体:
在访问映射内存时,底层文件的I/O错误(例如其可移动驱动器已拔出或光学介质已弹出,写入时磁盘已满等)将作为POSIX上的SIGSEGV/SIGBUS信号和Windows上的EXECUTE_IN_PAGE_ERROR结构化异常报告给应用程序。所有访问映射内存的代码都必须准备好处理这些错误,这些错误通常不会在访问内存时发生。
mmap
的POSIX规范 不要求在错误时传递信号,但为实现留下了这种可能性。
SIGSEGV
或SIGBUS
,但我可能错了。我非常确定他们甚至没有mmap()
,而是采用了完全不同的设计系统。但如果这些假设是错误的,我很乐意接受更正。 - hippietrailmmap
,但有几乎相同的CreateFileMapping
函数。我曾在不同平台上几乎可以互换地使用这两个函数。在Windows下也有SIGSEGV
,请参考http://msdn.microsoft.com/en-us/library/xdkz3x12(v=vs.71).aspx。 - vy32