linux 信号与处理

一、linux信号是什么

基本概念
信号是事件发生时对进程的通知机制,也就是所谓的软件中断。信号和硬件的中断类似,是软件层对中断机制的模拟,在多数情况下是无法预测信号产生的时间,所以软件层提供了一种处理异步事件的方法。

二、 信号来源

信号的来源分为硬件来源和软件来源。

硬件来源:

硬件发生异常,即硬件检测到错误条件并通知内核,随即再由内核发送相应的信号给相关进程,如除数为0、无效的内存引用等。

用户按终端键,引起终端产生的信号(比如Ctrl + C键产生SIGINT)。

软件来源:

用户通过指令杀死,如kill指令。

发生软件事件, 如程序执行raise, alarm、setitimer、sigqueue等函数。

三、 信号处理

信号通常是发送给对应的进程,当信号到达后,该进程需要做出相应的处理措施,通常进程会视具体信号执行相应的操作,有三种操作方式。

忽略信号:
  信号到达后、直接忽略,就好像是没有出该信号,信号对该进程不会产生任何影响。事实上,大多数信号都可以使用这种方式进行处理,但有两种信号却决不能被忽略,分别是SIGKILL 和 SIGSTOP。

捕获信号:
  当信号到达进程后,执行signal()绑定好的信号处理函数。

执行系统默认操作:
  进程不对该信号事件作出处理,而是交由系统进行处理,每一种信号都会有其对应的系统默认的处理方式。

四、常见信号

linux系统中通过kill -l命令可以查看到相应的信号。信号编号是从 1 开始,不存在编号为 0 的信号,事实上 kill()函数对信号编号 0 有着特殊的应用。

linux 信号与处理


注意:括号" ) "前面的数字对应该信号的编号,编号 1~31 所对应的是不可靠信号,编号 34~64 对应的是可靠信号,从图中可知,可靠信号并没有一个具体对应的名字,而是使用了 SIGRTMIN+N 或 SIGRTMAXN 的方式来表示。其中32和33空缺。
不可靠信号表

值 名称 解释 默认动作
1   SIGHUP   挂起    
2   SIGINT   中断    
3   SIGQUIT   退出    
4   SIGILL   非法指令    
5   SIGTRAP   断点或陷阱指令    
6   SIGABRT   abort发出的信号    
7   SIGBUS   非法内存访问    
8   SIGFPE   浮点异常    
9   SIGKILL   kill信号   不能被忽略、处理和阻塞  
10   SIGUSR1   用户信号1    
11   SIGSEGV   无效内存访问    
12   SIGUSR2   用户信号2    
13   SIGPIPE   管道破损,没有读端的管道写数据    
14   SIGALRM   alarm发出的信号    
15   SIGTERM   终止信号    
16   SIGSTKFLT   栈溢出    
17   SIGCHLD   子进程退出   默认忽略  
18   SIGCONT   进程继续    
19   SIGSTOP   进程停止   不能被忽略、处理和阻塞  
20   SIGTSTP   进程停止    
21   SIGTTIN   进程停止,后台进程从终端读数据时    
22   SIGTTOU   进程停止,后台进程想终端写数据时    
23   SIGURG   I/O有紧急数据到达当前进程   默认忽略  
24   SIGXCPU   进程的CPU时间片到期    
25   SIGXFSZ   文件大小的超出上限    
26   SIGVTALRM   虚拟时钟超时    
27   SIGPROF   profile时钟超时    
28   SIGWINCH   窗口大小改变   默认忽略  
29   SIGIO   I/O相关    
30   SIGPWR   关机   默认忽略  
31   SIGSYS   系统调用异常    
五、信号处理

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfsfp.html