Linux 进程何时处理信号
我想知道linux进程何时处理信号。 假设进程已经为信号安装了信号处理程序,我想知道进程的正常执行流何时会被中断,信号处理程序何时会被调用 根据,进程将在退出系统调用时处理信号。这意味着像a=b+c(或其等效机器代码)这样的正常指令不会因为信号而中断 此外,还有一些系统调用在收到信号时会被中断(并因EINTR失败或重新启动)。这意味着即使在系统调用完成之前,信号也会被处理。这种行为似乎与我在上一段中提到的相冲突 因此,我不清楚信号是在什么时候处理的,以及在哪个进程状态下由进程处理的。它能被打断吗Linux 进程何时处理信号,linux,signals,Linux,Signals,我想知道linux进程何时处理信号。 假设进程已经为信号安装了信号处理程序,我想知道进程的正常执行流何时会被中断,信号处理程序何时会被调用 根据,进程将在退出系统调用时处理信号。这意味着像a=b+c(或其等效机器代码)这样的正常指令不会因为信号而中断 此外,还有一些系统调用在收到信号时会被中断(并因EINTR失败或重新启动)。这意味着即使在系统调用完成之前,信号也会被处理。这种行为似乎与我在上一段中提到的相冲突 因此,我不清楚信号是在什么时候处理的,以及在哪个进程状态下由进程处理的。它能被打断吗
一个更正确的定义是:当一个信号被传递到进程时,控制流离开内核模式以继续执行用户模式代码。这不一定涉及到系统调用。在第7节的
信号手册页面中记录了很多信号处理的语义(无论如何,对于Linux-其他操作系统可能有类似的,但不一定在同一位置),如果安装在您的系统上,可以如下访问:
man 7 signal
如果未安装手动页面,则很容易找到在线副本。处理信号!=接收信号。我理解处理信号!=接收信号。假设已经安装了信号处理程序,我想知道什么时候调用该信号处理程序。(我更新了问题的文本,以避免您所指出的一些混乱。)这也取决于信号。一些(SIGILL、SIGSEGV、SIGKILL、SIGBUS等)是立即交付和处理的,其他的,正如您所注意到的,只在系统调用和其他用户内核边界(调度器等)上进行检查。也许缩小您的实际问题范围会有所帮助……这是一个相当大的主题,因此我建议您阅读(至少)手册页signal(7)
(在Linux上,假设已安装,只需键入man7 signal
)。如果你没有安装手册页,它们也应该很容易在网上找到…@twalberg谢谢你的回复。这真的很有帮助。我在手册页中发现了以下文字:“进程进入操作系统时(例如,在系统调用、页面故障或陷阱或时钟中断期间)可以随时发送信号。”这与tldp.org上所述完全相反,即当进程退出操作系统时发送信号。此外,它还提到了由于信号的原因,系统调用总是会通过EINTR进行,但我找不到关于信号传递时间的更多信息。