在 POSIX 系统中,终止信号通常有以下顺序(根据许多 MAN 页和 POSIX 规范) :
SIGTERM -礼貌地请求进程终止。它将优雅地终止,清除所有资源(文件、套接字、子进程等) ,删除临时文件等等。
SIGQUIT -更有力的请求。它会不合时宜地终止,仍然清理绝对需要清理的资源,但可能不会删除临时文件,可能会在某处写入调试信息; 在某些系统上也会写入一个核心转储(无论信号是否被应用程序捕获)。
SIGKILL -最强烈的请求。进程甚至不需要执行任何操作,但系统将清理进程,不管它是否喜欢这样做。很可能已经编写了核心转储。
SIGINT
怎么会出现在那张照片里?当用户点击 CRTL+C
时,一个 CLI 进程通常被 SIGINT
终止,但是一个后台进程也可以使用 KILL
实用程序被 SIGINT
终止。我在规范或头文件中看不到的是,SIGINT
是否比 SIGTERM
更强或更弱,或者 SIGINT
和 SIGTERM
之间有什么区别。
更新:
到目前为止,我发现对终止信号最好的描述是在 GNU LBC 文档中。它很好地解释了 SIGTERM 和 SIGQUIT 之间的预期差异。
它说的是 SIGTERM
:
这是礼貌地请求程序终止的正常方式。
上面写着 SIGQUIT
:
[ ... ]并在终止进程时产生一个内核转储,就像程序错误信号一样。 您可以将其视为用户“检测到”的程序错误条件 在处理 SIGQUIT 时,最好省略某些类型的清理 创建临时文件时,它应该通过删除临时文件来处理其他终止请求 但是 SIGQUIT 最好不要删除它们,这样用户就可以在 与堆芯倾倒物相连接。
SIGHUP
也被很好地解释了。SIGHUP 实际上并不是一个终止信号,它只是意味着与用户的“连接”已经丢失,所以应用程序不能期望用户读取任何进一步的输出(例如 stdout/stderr 输出) ,也不再期望用户输入。对于大多数应用程序来说,这意味着他们最好退出。理论上,当接收到 SIGHUP 并作为后台进程运行时,应用程序还可以决定进入守护进程模式,将输出写入已配置的日志文件。对于大多数已经在后台运行的守护进程来说,SIGHUP 通常意味着它们应该重新检查它们的配置文件,因此在编辑配置文件之后将其发送到后台进程。
然而,在这个页面上没有对 SIGINT 的有用解释,除了它是由 CRTL + C 发送的。有什么原因可以解释为什么对 SIGINT 的处理方式不同于 SIGTERM?如果是这样的话,原因是什么? 操作会有什么不同?