信号基本概念

来源:互联网 发布:手机淘宝体检中心链接 编辑:程序博客网 时间:2024/05/30 07:12

一、信号的基本概念
通过一个普遍例子来引入信号这个基本概念
1、自己写一个前台进程,在client.c文件中写一个程序,然后运行该程序
这里写图片描述
2、用Ctrl+c组合键来使该进程中断
这里写图片描述
3、分析一下该中断的过程
(1)用户创建一个前台进程
(2)输入Ctrl+c组合键,产生硬件中断
(3)如果CPU正在执行该前台进程,则暂停执行用户空间代码,CPU从用户态切换到内核态去处理该硬件中断
(4)终端驱动程序将Ctrl+c解释成一个SIGINT信号,然后写入前台进程的PCB中
(5)当某个时刻,从内核态返回到用户态,要先处理PCB中记录的信号
4、查看系统中所有的信号
通过[kill -l]指令可以查看系统下所有的信号类型
这里写图片描述
几点说明:
(1)信号的名称是用宏来表示的
(2)1~31之间的信号为普通信号,在PCB中用位图来表示
(3)34~64之间信号为实时信号
5、几点注意事项
(1)类似Ctrl+c这样的组合键产生的信号只能发给前台进程
(2)组合键能中断进程的根本原因是,这些组合键被解释成信号,这些信号被写进进程的PCB中
(3)信号在PCB中的存储形式是以位图的形式存在的,位图中的位置代表信号的编号,对应位置上的数字如果是1则代表收到信号,否则代表没有收到信号
二、处理信号的几种方法
1、忽略接收到的信号
2、自定义动作,又称捕捉信号
3、执行默认动作,即终止该进程
三、信号的产生
1、通过终端键产生信号,以Ctrl+c为例
(1)通过终端键Ctrl+c产生信号SIGINT,孩信号的默认动作是终止进程并且Core Dump
(2)Core Dump就是当一个进程异常终止时,将进程空间用户内存数据全部保存到磁盘上,而文件名通常是core
(3)进程终止通常是因为有异常出现,事后可以用调试器查看core文件来查找错误,这就叫做事后调试
(4)默认情况下是不允许产生core文件的,因为该文件中可能包含密码等敏感信息,但可以用ulimit指令来修改该权限
(5)core文件的大小取决于进程的Resource Limit
2、通过kill命令来产生信号
例:先写一个死循环
这里写图片描述
使用kill命令发送SIGSEGV信号来终止该进程
这里写图片描述
说明:
(1)kill指令是通过kill函数来实现的,kill函数可以给一个指定的进程发送一个指定的信号
(2)kill函数的原型如下:
这里写图片描述
该函数成功返回0,失败返回-1
3、软硬件异常产生信号
(1)SIGPIPE信号是一种由软件条件产生的信号
(2)SIGALRM信号
alarm函数:
a.该函数的作用是设定一个闹钟,闹钟时间到达之后就发送一个SIGALRM信号,该信号的默认动作是终止进程
b.该函数的原型是
这里写图片描述
c.如果该函数的返回值为0,表示取消以前设定的闹钟;如果该函数的返回值不为0,表示之前设定的闹钟剩余的时间
d.例:
这里写图片描述
说明:该函的作用是在闹钟时间到达之前,count不停的计数,但是可以发现最终count的值非常巨大,那是因为该函数中除了有闹钟之外还要捕捉信号SIGALRM,因此使进程的性能降低
4、特定的函数产生信号
(1)kill函数
前文提到过,该函数是kill命令的底层实现,该函数可以给任一进程发送任一信号
(2)raise函数
该函数的原型是:
这里写图片描述
该函数的作用是:给当前进程产生任一信号
(3)abort函数
该函数的原型是:
这里写图片描述
该函数的作用是:给当前进程发送6号信号
例:
这里写图片描述
该程序的运行结果是:
这里写图片描述
说明:abort函数是通过给进程发6号信号使进程终止的,属于异常终止范畴,而exit是正常终止进程,并且会指定进程退出时的退出码。