信号量
信号名称 | 编号 | 能否屏蔽 | 默认动作 | 俗称 |
---|---|---|---|---|
SIGINT | 2 | YES | 进程自己退出 | 自杀 |
SIGTERM | 15 | YES | 进程自己退出 | 自杀 |
SIGQUIT | 3 | YES | 执行 core dump 进程自己退出 | 自杀 |
SIGKILL | 9 | NO | 进程被内核干掉 | 它杀 |
对比杀进程的几个信号:SIGINT、SIGTERM、SIGQUIT、SIGKILL
- SIGINT ==> 在大部分 POSIX 系统的各种终端上,Ctrl + C 组合键触发的就是这个信号。
- SIGTERM ==> 它是 kill & killall 这两个命令【默认】使用的信号。
3. SIGQUIT ==> 这个信号类似于前两个(SIGINT & SIGTERM),差别在于——进程在退出前会执行“core dump”操作。 - SIGKILL ==> 前面三个信号都是【可屏蔽】,而这个信号是【不可屏蔽】。 当某个进程收到了【SIGKILL】信号,该进程自己【完全没有】处理信号的机会,而是由操作系统内核直接把这个进程干掉。
暂停进程
刚才聊“杀进程”的时候提到了“自杀 VS 它杀”。前者比较“温柔”;而后者比较“粗暴”。
对于暂停进程,也有“温柔 & 野蛮”两种玩法。而且也是用 kill 命令发信号。
【温柔】式暂停(SIGTSTP)
kill -TSTP 进程编号
这个【SIGTSTP】信号类似前面提及的【SIGINT】——
1. 两者默认都绑定到组合键(【SIGINT】默认绑定到组合键【Ctrl + C】;【SIGTSTP】默认绑定到组合键【Ctrl + Z】)
2. 这两个快捷键都是由【终端】截获,并发出相应的信号(具体原理参见本章节的某个小节)
3. 两者都是【可】屏蔽的信号。也就是说,如果某个进程屏蔽了【SIGTSTP】信号,你就【无法】用该方式暂停它。这时候你就得改用【粗暴】的方式(如下)。
【粗暴】式暂停(SIGSTOP)
kill -STOP 进程编号
这个【SIGSTOP】信号与前面提及的【SIGKILL】有某种相同之处——这两个信号都属于【不可屏蔽】的信号。也就是说,收到【SIGSTOP】信号的进程【无法】抗拒被暂停(suspend)的命运。
与“杀进程”的风格类似——当你想要暂停某进程,应该先尝试“温柔”的方法,搞不定再用“粗暴”的方法
恢复进程
kill -CONT 进程编号
重新恢复(resume)被暂停的进程,该命令发送信号【SIGCONT】