第一点
什么是信号
信号是一种内容受限的异步通信机制!(受限的意思是只能传信号,并不能传文字、图像之类的)
他的目的是在于通信!(进程与进程、进程与内核)
信号是异步的(对比硬件中断)本质上是int型数字编号!
信号的来源有:
(1)用户在终端按下按键;
(2)硬件异常后由操作系统内核发出信号;
(3)用户使用kill命令向其他进程发出信号;
(4)某种软件条件满足后也会发出信号,如alarm闹钟时间到会产生SIGALARM(sigalarm)信号、向一个读端已经关闭的管道write时会产生SIGPIPE(sigplpe)信号;
其实通俗的说,信号就是来源于硬件和软件两部分,硬件产生即通过终端按键产生的信号,比如Ctrl+C(SIGINT)软件产生即调用系统函数向进程发信号,比如kill、abort函数等
信号如何处理:
忽略处理; SIG_IGN
捕获处理(信号绑定一个函数);
默认处理(忽略或者终止进程);SIG_DFL
常见的信号
SIGINT | 2 | Ctrl+C时OS送给前台进程组中每个进程(终止进程) |
SIGABRT | 6 | 调用abort函数,进程异常终止 |
SIGPOLL SIGIO | 8 | 指示一个异步IO事件,在高级IO中提及 |
SIGKILL | 9 | 杀死进程的终极办法 |
SIGSEGV | 11 | 无效存储访问时OS发出该信号 |
SIGPIPE | 13 | 涉及管道和socket |
SIGALARM | 14 | 涉及alarm函数的实现 |
SIGTERM | 15 | kill命令发送的OS默认终止信号 |
SIGCHLD | 17 | 子进程终止或停止时OS向其父进程发此信号 |
SIGUSR1 | 10 | 用户自定义信号,作用和意义由应用自己定义 |
第二点
进程对信号的处理
对signal函数的解释(signal就是用来处理信号的)
这个函数有两个参数;
1.signum:更改的信号值(信号编码)
2.handler:函数指针,要更改的动作是什么
他的返回值为旧的捕获函数!!!!!
细节:
signal函数绑定一个捕获函数后信号发生后会自动执行绑定的捕获函数,并且把信号编号作为传参传给捕获函数
signal的返回值在出错时为SIG_ERR,绑定成功时返回旧的捕获函数
对SIGINT信号进行处理
第三点
alarm函数
alarm函数是内核以API形式提供的闹钟
下面是编程实践:
对上面函数的解释:
首先我们定义一个func函数,里面进行判断打印
在主函数里,我们调用signal函数对SIGALRM信号进行判断,当有SIGALRM发生时,调用func函数进行打印!
ret得到的是alarm的返回值,他里面的数字代表三秒!
最终的执行结果:显示ret=0,然后是打印alarm happened!
上面的代码是是用sigaction这个函数代替singal这个函数!
一个进程中只有一个alarm,如果多次调用,后面的会掩盖前面的!
alarm函数的的返回值是上一次调用alarm没走完,剩的时间!
结果:
pause函数
while(1)与 pause函数的区别:
while(1)是使CPU原地踏步的,其实CPU还在运行,这样其实很浪费资源!
pause函数是内核挂起(睡眠),交出CPU的执行权给其他进程,但是这种挂起如果有其他的信号,是会被打断的!