【问题标题】:When and how are system calls interrupted?系统调用何时以及如何中断?
【发布时间】:2011-12-24 09:16:03
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: linux system interrupt


    【解决方案1】:

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

    当设置SA_RESTART 时,如果在接收到信号之前传输了任何数据,则send() 将返回(带有发送计数),如果设置了发送超时(如那些不能重启),否则send()会重启。

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

    【讨论】:

    • 这只是意味着发送到我的进程的信号,对吧?我以某种方式假设内核处理我的中断(按键、鼠标移动、定时器中断……)的任何中断都会导致我的调用返回并发送信号。系统调用期间的上下文切换不应该以任何方式干扰我的进程,除了时间,对吧?
    • @lxgr,没错,上下文切换不会中止系统调用。
    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 2016-07-04
    • 2021-09-19
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多