【发布时间】:2013-01-14 14:54:03
【问题描述】:
我想知道 linux 进程何时处理信号。 假设进程已经为某个信号安装了信号处理程序,我想知道该进程的正常执行流程何时会被中断并调用信号处理程序。
根据http://www.tldp.org/LDP/tlk/ipc/ipc.html,进程将在退出系统调用时处理信号。这意味着像 a = b+c (或其等效的机器代码)这样的普通指令不会因为信号而被中断。
此外,有些系统调用会在收到信号时被中断(并因 EINTR 失败或重新启动)。这意味着甚至在系统调用完成之前就已经处理了信号。这种行为似乎与我在上一段中提到的相冲突。
因此,我不清楚何时处理信号以及进程将在哪些进程状态下处理信号。可以打断吗
- 任何时候从内核空间进入用户空间,或者
- 任何时候都在用户空间中,或者
- 任何时候进程被调度程序调度执行
谢谢!
【问题讨论】:
-
处理信号!= 接收信号。
-
我了解处理信号!=接收信号。假设已安装信号处理程序,我想知道何时调用该信号处理程序。 (我更新了问题的文本以避免您指出的一些混淆。)
-
这也取决于信号。一些(SIGILL、SIGSEGV、SIGKILL、SIGBUS 等)会立即交付和处理,而正如您所注意到的,其他一些仅在系统调用和其他用户内核边界(调度程序等)上检查。也许缩小你的实际问题会有所帮助......
-
这是一个相当大的话题,所以与其试图在这里描述它,我建议您阅读(至少)手册页
signal(7)(在 Linux 上,假设您已经安装了它们,只需键入 @ 987654323@)。如果您没有安装手册页,它们也应该很容易在网上找到...... -
@twalberg 感谢您的回复。这真的很有帮助。我在手册页中找到了以下文本“可以在进程进入操作系统的任何时候(例如,在系统调用、页面错误或陷阱或时钟中断期间)传递信号。”这与 tldp.org 上所说的完全相反,即在进程退出操作系统时传递信号。此外,它提到了由于信号,哪些系统调用将始终使用 EINTR,但我找不到有关信号传递时间的太多信息。