Jos*_*vin 10 c standards posix signals segmentation-fault
需要明确的是,这是一个设计而不是一个实现问题
我想知道POSIX为什么会这样做的理由.当给定无效的内存位置时,POSIX系统调用返回EFAULT而不是崩溃用户空间程序(通过发送sigsegv),这使得它们的行为与用户空间函数不一致.
为什么?这不是隐藏内存错误吗?这是一个历史错误还是有充分的理由呢?
因为系统调用是由内核执行的,而不是由用户程序执行的,所以当用户进行系统调用时,用户进程将暂停并等待内核完成。
当然,内核本身不允许发生段错误,因此它必须手动检查用户进程赋予它的所有地址区域。如果这些检查之一失败,则系统调用将失败EFAULT。因此,在这种情况下,实际上并没有发生分段错误-内核通过显式检查以确保所有地址均有效来避免了分段错误。因此,没有信号发送是有意义的。
此外,如果一个信号被发送,有好多是没有办法的内核可以附加一个有意义的程序计数器信号,系统调用运行时,用户进程没有实际执行。这意味着用户进程将无法产生体面的诊断,重新启动失败的指令等。
总结一下:主要是历史性的,但推理有实际逻辑。像一样EINTR,这也不会减少处理的烦恼。