需要明确的是,这是一个设计问题而不是实现问题
我想知道 POSIX 这样做的背后原因。 POSIX 系统调用在给定无效内存位置时返回 EFAULT 而不是使用户空间程序崩溃(通过发送 sigsegv),这使得它们的行为与用户空间函数不一致。
为什么?这不只是隐藏内存错误吗?这是一个历史错误还是有充分的理由?
最佳答案
因为系统调用是由内核执行的,而不是由用户程序执行的——当系统调用发生时,用户进程暂停并等待内核完成。
当然,内核本身是不允许出现段错误的,因此它必须手动检查用户进程提供给它的所有地址区域。如果其中一项检查失败,系统调用将失败并返回 EFAULT
。所以在这种情况下,段错误实际上并没有发生——内核明确检查以确保所有地址都有效,从而避免了这种情况。因此,没有发送信号是有道理的。
此外,如果发送了一个信号,内核将无法为该信号附加一个有意义的程序计数器,当系统调用被执行时,用户进程实际上并没有执行运行。这意味着用户进程无法产生正确的诊断、重新启动失败的指令等。
总结一下:主要是历史,但推理有实际逻辑。与 EINTR
一样,这并没有减少处理它的麻烦。
关于c - 为什么系统调用返回 EFAULT 而不是发送段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9605131/