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

标签 c segmentation-fault posix standards signals

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

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

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

最佳答案

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

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

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

总结一下:主要是历史,但推理有实际逻辑。与 EINTR 一样,这并没有减少处理它的麻烦。

关于c - 为什么系统调用返回 EFAULT 而不是发送段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9605131/

相关文章:

c - 如何识别哪个文件隐式依赖于与库的链接?

c - 为什么我在第二次搜索文件时收到段错误错误?

c++ - 哈希表中的段错误

c - 未知类型名称 'clockid_t'

c - main() 的 OSX 实现以及与 C 中的 POSIX getopt() 冲突的数据类型?

c - 将字符串解析为空终止数组的最佳方法是什么?

C - 如何解决 Invalid read of size 1 valgrind 错误

c - 意外的循环运行时间

c++ - 段错误 C++ 转换问题

c - 使用 posix C 同时多次轮询信号量