一尘不染

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

linux

这是成功的send()是“原子的”吗?,因为我认为它实际上实际上涉及系统调用,而不仅仅是在套接字上发送。

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

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

  • 设置SA_RESTART时,send()或任何其他“慢速”系统调用的语义是什么?它会一直阻塞直到我的所有数据传输完毕或套接字断开时,还是返回的数字小于send()参数中的计数?

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


阅读 653

收藏
2020-06-07

共1个答案

一尘不染

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

SA_RESTART被设置时,一个send()将返回(与发送的计数),如果任何数据发送被接收到的信号之前,它会返回一个错误EINTR,如果一个发送超时被设置(如那些无法重新启动),否则send()将被重新启动。

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

2020-06-07