SIGINT如何与其他终止信号相关?

时间:2010-10-28 10:59:32

标签: linux unix posix

在POSIX系统上,终止信号通常具有以下顺序(根据许多MAN页面和POSIX规范):

  1. SIGTERM - 礼貌地要求进程终止。它应该优雅地终止,清理所有资源(文件,套接字,子进程等),删除临时文件等。

  2. SIGQUIT - 更有力的请求。它应该终止不正常,仍然清理绝对需要清理的资源,但可能不会删除临时文件,可能会在某处写入调试信息;在某些系统上也会写入核心转储(无论信号是否被应用程序捕获)。

  3. SIGKILL - 最有力的请求。甚至没有要求该过程做任何事情,但系统将清理过程,无论是否喜欢。最有可能是核心转储。

  4. SIGINT如何适应这张照片?当用户点击CRTL + C时,CLI进程通常由SIGINT终止,但是后台进程也可以由SIGINT使用KILL实用程序终止。我在规范或头文件中看不到的是SIGINT是否比SIGTERM更强或更强,或者SIGINT和SIGTERM之间有任何区别。

    更新

    到目前为止,我发现的终止信号的最佳描述是GNU LibC Documentation。它很好地解释了SIGTERM和SIGQUIT之间存在预期的区别。

    关于SIGTERM:

      

    礼貌地要求程序终止是正常的方法。

    它说SIGQUIT:

      

    [...]并在终止进程时生成核心转储,就像程序错误信号一样。   您可以将此视为用户“检测到”的程序错误情况。 [...]   处理SIGQUIT时最好省略某些类型的清理。例如,如果程序   创建临时文件,它应该通过删除临时文件来处理其他终止请求   文件。但是SIGQUIT最好不要删除它们,以便用户可以检查它们   与核心转储相结合。

    SIGHUP也解释得很好。 SIGHUP实际上不是终止信号,它只是意味着用户的“连接”已经丢失,因此应用程序不能指望用户读取任何进一步的输出(例如stdout / stderr输出),并且没有输入可以从用户不再。对于大多数意味着他们退出的应用程序。从理论上讲,应用程序还可以决定在收到SIGHUP时进入守护进程模式,现在作为后台进程运行,将输出写入已配置的日志文件。对于已在后台运行的大多数守护进程,SIGHUP通常意味着他们将重新检查其配置文件,因此您在编辑配置文件后将其发送到后台进程。

    然而,除了由CRTL + C发送的SIGINT外,此页面上没有有用的SIGINT解释。是否有理由以不同于SIGTERM的方式处理SIGINT?如果是这样,那将是什么原因以及如何处理不同?

6 个答案:

答案 0 :(得分:71)

SIGTERM和SIGKILL旨在用于通用“终止此过程”请求。 SIGTERM(默认情况下)和SIGKILL(始终)将导致进程终止。 SIGTERM可能被进程捕获(例如,如果它想要它可以进行自己的清理),甚至完全忽略;但SIGKILL不能被抓住或忽视。

SIGINT和SIGQUIT专门用于来自终端的请求:可以分配特定的输入字符来生成这些信号(取决于终端控制设置)。 SIGINT的默认操作是与SIGTERM的默认操作和SIGKILL的不可更改操作相同的进程终止; SIGQUIT的默认操作也是进程终止,但可能会发生其他实现定义的操作,例如生成核心转储。如果需要,可以通过该过程捕获或忽略。

正如您所说,SIGHUP旨在表明终端连接已丢失,而不是终止信号。但是,同样,SIGHUP的默认操作(如果进程没有捕获或忽略它)是以与SIGTERM等相同的方式终止进程。

POSIXsignal.h定义中有一个表格列出了各种信号及其默认操作和目的,General Terminal Interface章节中包含了有关终端的更多详细信息 - 相关信号。

答案 1 :(得分:8)

由于DarkDust指出许多信号具有相同的结果,但是过程可以通过区分每个信号的生成方式来为它们附加不同的动作。查看FreeBSD内核源代码(kern_sig.c),我看到两个信号的处理方式相同,它们终止进程并传递给任何线程。

SA_KILL|SA_PROC,             /* SIGINT */
SA_KILL|SA_PROC,             /* SIGTERM */

答案 2 :(得分:7)

快速搜索sigint vs sigterm之后,两者之间的唯一预期差异似乎是它是由键盘快捷键还是通过显式调用kill启动的。

因此,您可以,例如,拦截sigint并对其执行一些特殊操作,因为它知道它可能是通过键盘快捷方式发送的。也许刷新屏幕或其他东西,而不是死亡(不推荐,因为人们期望^C杀死程序,只是一个例子。)

我还了解到^\应该发送sigquit,我可以自己开始使用。看起来很有用。

答案 3 :(得分:4)

有些是ANSI C,有些则不是

相当不同的是:

  • SIGINT和SIGTERM是ANSI C,因此更便携
  • SIGQUIT和SIGKILL不是

C99 draft N1256

的“7.14信号处理”部分对它们进行了描述
  • SIGINT收到交互式注意信号
  • SIGTERM发送给程序的终止请求

使SIGINT成为交互式Ctrl + C的良好候选者。

答案 4 :(得分:3)

使用kill(系统调用和实用程序),您可以向任何进程发送几乎任何信号,只要您获得了许可。进程无法区分信号的生命方式和发送者它

话虽如此,SIGINT确实意味着将Ctrl-C中断,而SIGTERM是一般的终端信号。没有信号“更有力”的概念,唯一的例外是有信号无法阻止或处理(SIGKILL和SIGSTOP,根据手册页)。

关于接收过程如何处理信号(以及该信号的默认动作是什么),信号只能比另一个信号“更有力”。例如,默认情况下,SIGTERM和SIGINT都会导致终止。但是如果忽略SIGTERM,那么它将不会终止你的进程,而SIGINT仍然会这样做。

答案 5 :(得分:0)

除少数信号外,信号处理程序可以捕获各种信号,或者可以修改接收信号时的默认行为。有关详细信息,请参阅signal(7)手册页。