关于我 首页

系统编程:信号(1)

2019-05-26

这篇博文只是记录我信号的一点笔记,并不详细也不权威,建议阅读《Linux/Unix系统编程手册》

下一篇:系统编程:信号(2)


信号是操作系统中一个重要的概念:是指某些事件发生时,对于进程的通知机制,也叫软件中断。

上面的解释似乎还不够具体,举两个例子:

信号的种类和默认行为

相信从上面的的概念解释中,已经明白了信号的含义了;那么自然会有两个疑问了:

Linux中标准信号有31个,分别是按照 1-31 进行编号,例如SIGINT对应的编号是2,SIGTERM对应的编号是15。

关于信号的描述放在man第7章中,我们可以通过 man 7 signal 来查看:

signal文档1 (这个文档我也只是稍微看过大概,很多也不是很清晰,就不扯太多了以免有错。)

这里我们先关注进程对于信号的处理,也就是上图中Signal dispositions这一节,从文档来看进程对信号的处理大概有几种:

然后往下来,可以看到所有的信号,和他们对应的信号值,以及进程接受到信号时会采取的操作,以及产生信号的原因。 signal文档2

从上图就能看到 SIGINT 和 SIGTERM 信号对应的信号值分别是2和15,而他们对应的ACTION则都是Term也就是终止进程。

信号的发送:kill

结合前面说的能知道,通过按下Ctrl+C可以给当前shell运行的进程发送SIGINT信号,而通过kill 进程号能给进程发送SIGTERM信号。那么考虑:如果想给进程发送别的信号怎么办呢?

答案:还是 kill 命令。 kill命令其实是:给进程发送信号的命令,只不过默认的情况下,发送的是SIGTERM信号。可以通过man 1 kill来查看 kill 命令的详细文档。所以如果你愿意,可以通过 kill 命令来给进程发送别的信号。

通过 kill -l 能看到 kill 能发送的所有信号:

$ kill -l
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS

再延伸一下,网上很多文档说,如果进程通过kill杀不掉,可以使用 kill -9 进程号 的方式来强杀,实际上就是给进程发送 9 这个信号,而通过上面的截图我们知道是SIGKILL信号,这个信号不能被阻塞,所以就一定能杀死进程。

kill 命令的底层实现,实际上也是内核提供了一个系统调用:int kill(pid_t pid, int sig)来供进程之间发送信号,关于这个kill()系统调用也可以看一下man 2 kill的文档,非常有帮助。