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

Jos*_*vin 10 c standards posix signals segmentation-fault

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

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

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

Dav*_*ven 5

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

当然,内核本身不允许发生段错误,因此它必须手动检查用户进程赋予它的所有地址区域。如果这些检查之一失败,则系统调用将失败EFAULT。因此,在这种情况下,实际上并没有发生分段错误-内核通过显式检查以确保所有地址均有效来避免了分段错误。因此,没有信号发送是有意义的。

此外,如果一个信号发送,有好多是没有办法的内核可以附加一个有意义的程序计数器信号,系统调用运行时,用户进程没有实际执行。这意味着用户进程将无法产生体面的诊断,重新启动失败的指令等。

总结一下:主要是历史性的,但推理有实际逻辑。像一样EINTR,这也不会减少处理的烦恼。

  • 您对信号“附加有意义的程序计数器”是什么意思?您的意思是说,用户信号处理程序执行后,它不知道从哪里恢复?那不是就在系统调用之后吗? (2认同)