在卸载的文件上执行mmap()后避免崩溃

Cum*_*tru 5 c unix kernel mmap

我正在对可以卸载的文件执行mmap()(该文件位于用户可以随时删除的USB设备上),如果文件已卸载,我的应用程序崩溃然后我尝试访问任何元素在缓冲区.

对此有何解决方案?

R..*_*R.. 7

首先,我想说这应该是一个很好的论据,不要 mmap不必要地使用 "优化读取"或类似的.除了设备删除之外,其他进程的文件截断等问题都可能导致访问错误SIGBUS.

如果确实需要使用mmap,可以安装信号处理程序SIGBUS.它的任务基本上应该是:

  1. 设置一个全局(或线程本地,如果你的程序是多线程的)标志SIGBUS发生了,所以故障代码可以知道.
  2. 调用mmapMAP_FIXED在错误页面顶部映射新的匿名页面.可选地填充数据,该数据将被访问地图的代码识别为错误的; 这可能使第1步不必要.

另一种方法是jmp_buf在访问映射之前设置全局(或线程本地),并让信号处理程序简单地调用longjmp.

请注意,既不是异步信号安全mmap也不longjmp是异步信号安全,但SIGBUS问题不是异步信号(尽管如果故障访问发生在非异步信号安全库函数中,它应该被认为是一个sscanf).只要它是你自己的代码,而不是库函数,访问地图,你应该是安全的.并且mmap在大多数/所有实际实现中都是异步信号安全的,所以即使它不是正式的,你也应该在实践中使用第一个解决方案.

  • 会这样说:对于"mmap"来说,还有更多的东西可以满足要求 - 因为错误处理比传统的I/O要复杂得多.这不一定是_against using_`mmap`的原因......只要知道你召唤的灵魂;-) (2认同)

swe*_*egi -2

不要访问不可用的文件。检查文件是否还在,或者使用无法卸载的文件。

  • 由于可能存在竞争条件,我认为这不是很有帮助。预期并捕获访问映射区域的代码周围的“SIGBUS”是否有帮助?或者类似的东西? (4认同)