1. 什么是信号
1·1 信号是内容受限的一种异步通信机制
(1)信号的目的:用来通信。进程与进程之间的通信,进程与内核之间的通信。
(2)对比硬件中断,信号是异步的。
(3)信号本质上是int类型数字编号(已经定义好的)
1·2 信号由谁发出
(1)用户在终端按下按键
(2)硬件异常后由操作系统内核发出信号
(3)用户使用kill命令向其他进程发出信号
(4)某种软件条件满足后也会发出信号,比如alarm闹钟时间到会产生SIGALARM信号,向一个读端已经关闭的管道write时会产生一个SIGPIPE信号。
1·3 信号由谁处理,如何处理
(1)忽略信号
(2)捕获信号
(3)默认信号
2· 常见信号介绍
3· 进程对信号的处理
用signal函数处理SIGINT信号
signal函数绑定一个捕获函数后 信号发生后会自动执行绑定的捕获函数(自己写的),并且把信号编号作为传参给捕获函数。
signal的返回值在出错时为SIG_ERR,绑定成功时返回旧的捕获函数。
4· alarm函数 和 pause函数
alarm函数:定时后发出一个SIGALRM信号,捕获函数(自己写的)去捕获这个信号并且执行一定的功能。
#include<stdio.h>
#include <unistd.h>
#include <signal.h>
void func_buhuo( int sig)
{
if(sig == SIGALRM)
{
printf("this is func_buhuo!!\n");
}
}
int main(void)
{
int ret = -1;
signal(SIGALRM,func_buhuo);// 将SIGALRM信号与捕获函数绑定
ret = alarm(5);// 定时5s的闹钟,到时间后会发送SIGALRM信号。
printf("ret = %d\n", ret);
while(1);
// 这里死循环是因为让main函数一直执行,
//避免捕获函数等不到闹钟信号的情况
/*简述一下过程:alarm函数会定时一个5s的闹钟,
在5s的闹钟计时的时间内,main函数还是会
往后面执行,所以一定要保证后面的程序可以
让main函数一直执行至少5s,
这样才能使alarm函数发送SIGLARM信号让捕获函数去捕获
*/
return 0;
}
结果:
ret = 0
this is func_buhuo!! 【过了5秒才打印出这句话的】
^C 【由于main函数是一种死循环所以需要CTRL C 结束执行】
alarm函数的返回值就是上一次alarm函数的剩余定时秒数
while(1)是占用cpu来消耗时间,while(1)的时候cpu并不能去执行其他的。
但是pause函数与while(1)不同。内核睡眠,让当前进程暂停运行,交出cpu给其他进程去执行。