Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 进程何时处理信号_Linux_Signals - Fatal编程技术网

Linux 进程何时处理信号

Linux 进程何时处理信号,linux,signals,Linux,Signals,我想知道linux进程何时处理信号。 假设进程已经为信号安装了信号处理程序,我想知道进程的正常执行流何时会被中断,信号处理程序何时会被调用 根据,进程将在退出系统调用时处理信号。这意味着像a=b+c(或其等效机器代码)这样的正常指令不会因为信号而中断 此外,还有一些系统调用在收到信号时会被中断(并因EINTR失败或重新启动)。这意味着即使在系统调用完成之前,信号也会被处理。这种行为似乎与我在上一段中提到的相冲突 因此,我不清楚信号是在什么时候处理的,以及在哪个进程状态下由进程处理的。它能被打断吗

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

根据,进程将在退出系统调用时处理信号。这意味着像a=b+c(或其等效机器代码)这样的正常指令不会因为信号而中断

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

因此,我不清楚信号是在什么时候处理的,以及在哪个进程状态下由进程处理的。它能被打断吗

  • 任何时候它从内核空间进入用户空间,或者
  • 在用户空间中的任何时间,或
  • 调度程序计划执行进程的任何时间
  • 谢谢

    根据,进程将在退出系统调用时处理信号。这意味着像a=b+c(或其等效机器代码)这样的正常指令不会因为信号而中断

    如果是这样的话,CPU密集型进程将不会遵守进程调度器。实际上,调度器可以在进程的时间量已过的任何时间点中断进程。除非是FIFO实时处理


    一个更正确的定义是:当一个信号被传递到进程时,控制流离开内核模式以继续执行用户模式代码。这不一定涉及到系统调用。

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

    man 7 signal
    

    如果未安装手动页面,则很容易找到在线副本。

    处理信号!=接收信号。我理解处理信号!=接收信号。假设已经安装了信号处理程序,我想知道什么时候调用该信号处理程序。(我更新了问题的文本,以避免您所指出的一些混乱。)这也取决于信号。一些(SIGILL、SIGSEGV、SIGKILL、SIGBUS等)是立即交付和处理的,其他的,正如您所注意到的,只在系统调用和其他用户内核边界(调度器等)上进行检查。也许缩小您的实际问题范围会有所帮助……这是一个相当大的主题,因此我建议您阅读(至少)手册页
    signal(7)
    (在Linux上,假设已安装,只需键入
    man7 signal
    )。如果你没有安装手册页,它们也应该很容易在网上找到…@twalberg谢谢你的回复。这真的很有帮助。我在手册页中发现了以下文字:“进程进入操作系统时(例如,在系统调用、页面故障或陷阱或时钟中断期间)可以随时发送信号。”这与tldp.org上所述完全相反,即当进程退出操作系统时发送信号。此外,它还提到了由于信号的原因,系统调用总是会通过EINTR进行,但我找不到关于信号传递时间的更多信息。