Since system calls are made by the kernel and not by the user program — when a system call occurs, the user process stops and waits for the kernel to finish.
The kernel itself, of course, is not allowed to segregate, so it must manually check all the address areas that the user process provides. If one of these checks fails, the system call fails with an EFAULT
error. Thus, in this situation, the segmentation error does not actually occur - it avoided the kernel by explicitly checking that all addresses were valid. Therefore, it makes sense that no signal is sent.
In addition, if a signal were sent, the kernel could not connect a meaningful program counter to the signal; the user process is not actually executed when the system call is launched. This means that the user process will not be able to provide decent diagnostics, restart a failed command, etc.
To summarize: mostly historical, but there is an actual logic of reasoning. Like EINTR
, this does not make it less annoying to deal with.
source share