gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:23:02 24 4
gpt4 key购买 nike

这是 Is a successful send() "atomic"? 的后续问题,因为我认为它实际上涉及一般的系统调用,而不仅仅是在套接字上发送。

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

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

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

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

最佳答案

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

SA_RESTART 设置时,send() 将返回(带有发送计数)如果在接收到信号之前有任何数据传输,它将返回一个错误EINTR 如果设置了发送超时(因为无法重新启动),否则 send() 将重新启动。

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

关于linux - 系统调用何时以及如何中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8049756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com