【问题标题】:When does a process handle a signal进程何时处理信号
【发布时间】:2013-01-14 14:54:03
【问题描述】:

我想知道 linux 进程何时处理信号。 假设进程已经为某个信号安装了信号处理程序,我想知道该进程的正常执行流程何时会被中断并调用信号处理程序。

根据http://www.tldp.org/LDP/tlk/ipc/ipc.html,进程将在退出系统调用时处理信号。这意味着像 a = b+c (或其等效的机器代码)这样​​的普通指令不会因为信号而被中断。

此外,有些系统调用会在收到信号时被中断(并因 EINTR 失败或重新启动)。这意味着甚至在系统调用完成之前就已经处理了信号。这种行为似乎与我在上一段中提到的相冲突。

因此,我不清楚何时处理信号以及进程将在哪些进程状态下处理信号。可以打断吗

  1. 任何时候从内核空间进入用户空间,或者
  2. 任何时候都在用户空间中,或者
  3. 任何时候进程被调度程序调度执行

谢谢!

【问题讨论】:

  • 处理信号!= 接收信号。
  • 我了解处理信号!=接收信号。假设已安装信号处理程序,我想知道何时调用该信号处理程序。 (我更新了问题的文本以避免您指出的一些混淆。)
  • 这也取决于信号。一些(SIGILL、SIGSEGV、SIGKILL、SIGBUS 等)会立即交付和处理,而正如您所注意到的,其他一些仅在系统调用和其他用户内核边界(调度程序等)上检查。也许缩小你的实际问题会有所帮助......
  • 这是一个相当大的话题,所以与其试图在这里描述它,我建议您阅读(至少)手册页 signal(7)(在 Linux 上,假设您已经安装了它们,只需键入 @ 987654323@)。如果您没有安装手册页,它们也应该很容易在网上找到......
  • @twalberg 感谢您的回复。这真的很有帮助。我在手册页中找到了以下文本“可以在进程进入操作系统的任何时候(例如,在系统调用、页面错误或陷阱或时钟中断期间)传递信号。”这与 tldp.org 上所说的完全相反,即在进程退出操作系统时传递信号。此外,它提到了由于信号,哪些系统调用将始终使用 EINTR,但我找不到有关信号传递时间的太多信息。

标签: linux signals


【解决方案1】:

根据http://www.tldp.org/LDP/tlk/ipc/ipc.html,进程将在退出系统调用时处理信号。这意味着像 a = b+c (或其等效的机器代码)这样​​的普通指令不会因为信号而被中断。

好吧,如果是这样,CPU 密集型进程将不会服从进程调度程序。事实上,调度程序可以在其时间片过去的任何时间点中断进程。除非是先进先出的实时进程。

更正确的定义:将信号传递给进程的一个时间点是控制流离开内核模式以恢复执行用户模式代码的时间。这不一定涉及系统调用。

【讨论】:

    【解决方案2】:

    信号处理的许多语义都记录在第 7 节 signal 手册页中(对于 Linux,无论如何 - 其他操作系统可能有类似的,但不一定在同一位置),如果安装在您的系统上, 可以这样访问:

    man 7 signal
    

    如果没有安装手册页,很容易找到在线副本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多