何时以及如何中断系统调用?

这是一个成功的send()“primefaces”的后续问题? ,因为我认为它实际上涉及系统调用,而不仅仅是发送套接字。

哪些系统调用可以被中断,以及何时中断处理在哪里? 我已经了解了SA_RESTART,但并不完全明白发生了什么。

系统调用可以被任何信号中断,包括SIGINT(由CTRL-C生成),SIGHUP等信号。

当设置SA_RESTART ,如果在接收到信号之前发送了任何数据, send()将返回(带有发送计数),如果发送超时被设置(因为那些不能被重新启动),它将返回错误EINTR ,否则send()将会重新启动。

系统调用重启在内核的信号处理代码中实现。 系统调用在检测到待处理的信号(或者被信号中断等待)时在内部返回-ERESTARTSYS ,这导致信号处理代码将指令指针和相关寄存器恢复到调用之前的状态,从而使系统调用重复。