「信号机制」简述Linux信号

转载请保留出处: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

「信号机制」简述Linux信号_第1张图片

 

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章

 

你可能感兴趣的:(操作系统)