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

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

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

  • 如果我在没有SA_RESTART的情况下进行系统调用,是否可以通过任何不涉及我的应用程序的中断(例如用户input)来中断呼叫,但是需要操作系统放弃我的呼叫并执行其他操作? 还是只是直接关系到我的进程信号中断(CTRL + C,套接字closures,…)?

  • 设置SA_RESTART时,send()或其他任何“慢”系统调用的语义是什么? 它会一直阻塞,直到所有的数据传输或套接字closures,或者它可以返回一个小于send()的参数计数的数字吗?

  • 在哪里重新启动实施? 操作系统是否知道我希望在发生任何中断时重新启动呼叫,还是将一些信号发送到我的stream程,然后通过库代码处理? 或者我必须自己做,例如,在一个while循环中打包调用,并根据需要重试?

Solutions Collecting From Web of "何时以及如何中断系统调用?"

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

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

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