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

lxg*_*xgr 16 linux system interrupt

是一个成功发送()"原子"的后续问题,我认为它实际上涉及系统调用,而不仅仅是发送套接字.

哪些系统调用可以中断,何时中断处理中断?我已经了解了SA_RESTART,但并不完全了解发生了什么.

  • 如果我在没有SA_RESTART的情况下进行系统调用,是否可以通过与我的应用程序无关的任何类型的中断(例如用户输入)来中断调用,但要求操作系统中止我的呼叫并执行其他操作?或者它只是被与我的进程直接相关的信号中断(CTRL + C,套接字关闭,......)?

  • 设置SA_RESTART时,send()或任何其他"慢"系统调用的语义是什么?它是否会一直阻塞,直到我的所有数据都被传输或套接字关闭,或者它是否能以小于send()参数中的计数的数字返回?

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

Has*_*kun 11

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

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

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