问题与信号处理,中断处理

当进程正在执行一个阻塞的系统调用时,比如读或写,信号已经到达。 系统调用是否以错误EINTR结束? 处理系统调用后系统调用是否重新启动?

假设系统调用以错误EINTR结束,内核在回到用户空间之前处理信号。

信号句柄是否在用户模式/内核模式下执行? 如果处于用户模式,那么在系统调用(读/写)之后,在信号到达之后是否会返回到指令,或者在处理完信号后再次进入内核模式并从ret_from_syscall返回给用户。 信号到达时系统调用旁边的指令如何恢复执行?

是否可以通过在sigaction中传递SA_RESTART标志来重新启动系统?

Solutions Collecting From Web of "问题与信号处理,中断处理"

信号在用户模式下执行,但用不同的用户上下文 ,然后返回到内核,用ret_from_syscall返回到user_mode。 信号处理程序安装SA_RESTART时系统调用的行为取决于系统调用。

信号概述手册页的最新版本中提供了重新启动哪个系统调用的说明:

man 7 signal 

如果不使用SA_RESTART标志,系统调用不会重新启动。