我知道终止前台进程的推荐方法是通过SIGTERM
信号,因为它为进程本身提供了清理/释放资源的机会。该信号只能通过命令生成/发送,它可以通过任何kill
pkill
killall
命令 - 直到这里我没问题。此外,它是这些命令的默认信号。
现在,我知道SIGINT
信号中断了一个过程。因此“相似”为terminate。
但是我从以下内容中阅读了以下答案(摘录):
SIGINT
并且SIGQUIT
专门用于来自终端的请求:可以分配特定的输入字符来生成这些信号(取决于终端控制设置)。的默认操作与 的默认操作和不可更改的操作相同的进程终止;SIGINT
SIGTERM
SIGKILL
直到这里根据答案是由组合键 ( + )SIGINT
触发并且理论上与 相同,它即将:给程序本身清理/释放资源的机会。ctrlc SIGINT
SIGTERM
老实说,在阅读了许多教程之后,我无法明确地找到并确认该信息。例如来自:
在许多地方,这些信号都使用了中断和终止术语。
此外,从相同的答案存在@Jonathan Leffler的评论(摘录)为:
这是关键点:
SIGINT
并且SIGQUIT
可以在程序运行时从终端使用单个字符生成。其他信号必须由另一个程序以某种方式(例如通过kill
命令)生成。SIGINT
不那么暴力SIGQUIT
;后者产生核心转储
直到这里作为一个可能的结论:SIGINT
可以通过组合键或命令触发,并且SIGTERM
只能通过命令触发。
这篇文章的原因:如果理论上 SIGINT
是一样的SIGTERM
问题
- 何时以
SIGINT
编程方式强制发送?
它出现在 中kill -l
,所以可以使用它。
额外问题
同样,如果理论上 SIGINT
与SIGTERM
- 相同,则两者都可以忽略/阻止/处理
- 为什么被创建
SIGINT
? - 为什么ctrl+c没有从一开始就分配给
SIGTERM
?
老实说,我认为这SIGINT
是不安全的,因为它会中断进程,因此会使一些数据处于不一致/完整的状态
和(以及许多其他信号)的默认操作是终止进程。这在例如Linux 手册页中有记录,请参阅下面部分引用的“标准信号”下的表格。在实践中也是如此。
SIGINT
SIGTERM
signal(7)
那里的部分表格:
现在,这是默认操作。对于大多数信号,接收它们的程序可以通过预先设置一个信号处理函数来捕获它们,或者完全忽略它们。知道 a
SIGINT
通常是由用户按 Ctrl-CSIGTERM
发送的,并且通常是由其他一些要求接收者退出的程序发送的,因此程序可以决定以不同的方式处理它们。交互式程序可能决定直接结束任何长时间运行的任务
SIGINT
而不是立即退出,让用户可以选择退出或做一些不同的事情。一直在退出SIGTERM
。再说一次,一个更简单的程序可能会为它们设置相同的处理程序(可能还有一些其他的,比如SIGHUP
):一个保存所有数据并退出的程序。例如,我在 Debian 上尝试的交互式 Bash shell 会在
SIGINT
不执行任何操作的情况下清除当前命令行;忽略SIGTERM
(有点令人惊讶,但它可能与向整个进程组发送信号有关);并退出SIGHUP
(因为SIGHUP
意味着终端连接消失了,所以尝试阅读更多命令没有意义)。大多数信号允许接收进程在(可能)退出之前进行任何它喜欢的清理。两个异常信号是
SIGKILL
andSIGSTOP
,它们不能被捕获或忽略,但它们会无条件地立即破坏或停止进程,而不让它进行任何清理。(虽然请注意内核仍然会执行操作系统资源所需的任何清理,但这里的清理更多的是关于进程内存中未保存的数据。)当然,还有其他信号也默认终止进程。Like
SIGALRM
,由alarm()
系统调用设置的定时器发送。虽然默认行为在某些情况下可能有用,但它作为通用闹钟更有用,例如告诉程序执行一些周期性任务。答案是:从来没有。发送信号从来都不是强制性的。信号是用来捕捉的,不是用来发送的。
答案在于信号代码 - SIGINT=2、SIGKILL=9、SIGTERM=15。首先创建 SIGINT 并分配给 ^C。然后人们发现 ^C 有时必须由应用程序处理(或可以处理),因此添加了新的 'special' SIGKILL 供
kill
工具使用。然后这个信号被许多应用程序捕获,并发明了 SIGTERM,希望这个信号将是无法捕获的......关键是:
man 7 signal
as中描述的所有信号terminate application
都完全如此 - 默认情况下终止,应该终止,通常终止......但是由于应用程序可以捕获和处理它喜欢的任何信号,但是它喜欢 - 这一切都变成了一个建议,而不是规则。这里的关键词是“传统”。