转载请保留出处:https://blog.csdn.net/jinixin/article/details/80382331
工作中再次接触到了Linux信号,以前认为由于离底层比较远,信号没什么用,但这次发现其的一个用途,故打算在此做个简单记录。
记录共有三篇,本文是开篇,简单介绍Linux信号;第二篇介绍Python语言中负责信号处理的signal模块,并给出一些demo;第三篇则介绍信号的一个应用。三篇组成一个系列,想起抛砖引玉的作用,希望对大家能有所帮助。
信号是操作系统和程序间通信的一种方式,程序监听信号,并在收到信号后按照既定指示进行下一步操作,信号可由操作系统或其他应用程序发出。
操作系统为每个信号都设计好了默认操作,而我们通过编程可以代替系统先前设定的操作,或直接要求程序忽略某些信号。
因此程序在接收到信号后,可能会按系统既定的默认操作执行,也可能会忽略该信号,或者使用我们编写的替代方案。但有些信号是不可被替换的,具体下面会提到。
1)kill -l
显示系统所支持的信号名列表
2)kill [-signal] 进程号
给指定进程发送一个信号
其中signal为可选项,其值为“信号编号”或“SIG+信号名”,缺省时默认发送TERM信号。个人推荐用“SIG+信号名”的组合,因为不同操作系统中信号编号可能不一致,但信号名往往是一样的。
举例:先使用tree命令在后台打印当前目录结构,通过ps命令找到其进程号,使用kill命令向其发送终止信号TERM
3)killall [-user] [-signal] 进程名
给多个进程发送一个信号
其中user与signal均为可选参数,signal上面已经介绍过,user则指定了作用于该用户下的进程。
使用“kill*”操作需注意,和文件一样,进程也有所有者,只有进程的所有者或超级用户才能使用kill命令来给进程发信号。
Mac可通过“man signal”命令打印系统所支持的信号量,包括信号名和所对应的信号编号。不同的操作系统,信号名是一样的,但信号编号可能不一致,下面是Mac系统的几个常用信号量。
1)信号名:HUP,信号编号:1
挂起信号,用于终止进程。当用户关闭终端时发出该信号,通知同个session内各进程退出。该信号也被很多后台程序用来平滑重启,如Apache服务器接收到该信号后会重新初始化服务。
2)信号名:INT,信号编号:2
中断信号,用于终止进程,用户键入「CTRL-C」时发出该信号。
3)信号名:QUIT,信号编号:3
退出信号,用于终止进程,退出程序运行,用户键入「CTRL-\」时发出该信号。
4)信号名:KILL,信号编号:9
杀死信号,用于终止进程,立即结束程序执行。
程序接收到该信号后立即停止执行,不做任何清理或保存工作,该信号不可被替代或忽略。其实该信号不会真正的发送给目标程序,而是内核自己终止了对应进程。该信号建议只在其他信号都执行无效的情况下使用。
5)信号名:TERM,信号编号:15
终止信号,用于终止进程,要求程序结束执行。
程序接收到该信号后可执行清理,保存完毕后再退出,该信号可被替换或忽略。shell中的kill命令,默认发出该信号。
6)信号名:ALRM,信号编号:14
时钟定时信号,计算的是时钟时间。
7)信号名:VTALRM,信号编号:26
时钟定时信号,计算的是进程实际使用CPU的时间。
8)信号名:CHLD,信号编号:19
子进程结束后,父进程会收到该信号。若父进程未处理该信号,或没有等待子进程。子进程虽然终止,但仍会在内核进程表中占有表项,此时子进程被称为僵尸进程。
9)信号名:STOP,信号编号:17
暂停信号,用于暂停进程,该信号不可被替代或忽略。
10)信号名:TSTP,信号编号:18
终端暂停信号,用于暂停进程,用户键入「CTRL-Z」时发出该信号。
11)信号名:USR1,信号编号:30
用户自定义信号1
12)信号名:USR2,信号编号:31
用户自定义信号2
对于绝大多数的信号,操作系统已为我们定义好了程序在接收后的默认操作。如果我们想自己重新定义程序接收信号后的操作,可以看这篇博客,那里将使用Python的signal模块做一些小demo。
文中如有不当之处,还望包容和指出,感谢~
参考自:《Linux命令行大全》第10章