一、信号概念
是什么?
Linux系统提供的让用户(进程)给其他进程发送异步信息的一种方式,注意,信号与信号量没有任何关系。
1、进程可以识别信号并作处理;
2、信号到来时,如果此时有更重要的事情要处理,那么到来的信号要临时保存,即在合适的时候处理;
3、信号的产生是随时的,不能准确预料,所以信号是异步发送的;
4、信号的产生,是由别的进程产生的,当前的进程收到这个信号之前,在做其他的事情,是并发的。
为什么?
因为系统要求进程要有随时响应外部信号的能力,并作出反应。
怎么办?
准备->信号产生->信号保存->信号处理
准备:
1️⃣常见信号:
数字和名字都可以识别信号,名字其实是宏。从34开始是实时信号。注意,没有32、33信号。
2️⃣信号的处理方式
有:默认、自定义、忽略
默认,就是按原来信号的处理方式进行处理
比如:下面代码死循环用2号信号终止,终止是2号信号的默认处理方式
int main()
{
while(true)
{
cout << "I am acting..., pid: " << getpid()<<endl;
sleep(1);
}
return 0;
}
自定义是由用户来决定信号的处理方式,与信号的默认处理方式不同。2号信号是终止进程,用户可以让它的处理方式通过函数变成打印一句话和终止进程,终止进程的退出码为100,再把函数给系统调用接口signal。自定义的方式也叫信号的捕捉。
void handler(int sig)
{
cout << "I am a sig, sig: " <<sig<<endl;
exit(0);
}
int main()
{
signal(2, handler);
while(true)
{
cout << "I am acting..., pid: " << getpid()<<endl;
sleep(1);
}
return 0;
}
注意:signal调用完,handler方法不会立即被执行,要收到对应的信号才执行;如果没有收到信号