为什么系统调用返回 EFAULT 而不是发送段错误?

2024-03-19

需要明确的是,这是一个设计问题,而不是一个实现问题

我想知道 POSIX 这样做的背后的基本原理。当给定无效内存位置时,POSIX 系统调用返回 EFAULT,而不是使用户空间程序崩溃(通过发送 sigsegv),这使得它们的行为与用户空间函数不一致。

为什么?这不是隐藏了内存错误吗?这是一个历史错误还是有充分的理由?


因为系统调用是由内核执行的,而不是由用户程序执行的——当系统调用发生时,用户进程会暂停并等待内核完成。

当然,内核本身不允许出现段错误,因此它必须手动检查用户进程提供给它的所有地址区域。如果这些检查之一失败,系统调用就会失败EFAULT。因此,在这种情况下,分段错误实际上并未发生——内核显式检查以确保所有地址都有效,从而避免了分段错误。因此,没有发送信号是有道理的。

另外,如果有信号were发送后,内核无法将有意义的程序计数器附加到该信号,当系统调用运行时,用户进程实际上并未执行。这意味着用户进程无法产生正确的诊断、重新启动失败的指令等。

总结一下:大部分是历史性的,但推理有实际的逻辑。喜欢EINTR,这并没有减少处理起来的烦恼。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么系统调用返回 EFAULT 而不是发送段错误? 的相关文章

随机推荐