首先,我想说这应该是一个很好的论据,不要 mmap不必要地使用 "优化读取"或类似的.除了设备删除之外,其他进程的文件截断等问题都可能导致访问错误SIGBUS.
如果确实需要使用mmap,可以安装信号处理程序SIGBUS.它的任务基本上应该是:
SIGBUS发生了,所以故障代码可以知道.mmap以MAP_FIXED在错误页面顶部映射新的匿名页面.可选地填充数据,该数据将被访问地图的代码识别为错误的; 这可能使第1步不必要.另一种方法是jmp_buf在访问映射之前设置全局(或线程本地),并让信号处理程序简单地调用longjmp.
请注意,既不是异步信号安全mmap也不longjmp是异步信号安全,但SIGBUS问题不是异步信号(尽管如果故障访问发生在非异步信号安全库函数中,它应该被认为是一个sscanf).只要它是你自己的代码,而不是库函数,访问地图,你应该是安全的.并且mmap在大多数/所有实际实现中都是异步信号安全的,所以即使它不是正式的,你也应该在实践中使用第一个解决方案.
swe*_*egi -2
不要访问不可用的文件。检查文件是否还在,或者使用无法卸载的文件。