目录
信号和信号量是两个完全不相干的技术,不要混淆。
什么是信号?
Linux让系统提供让用户给其他进程异步发送消息的一种方式。
站在进程的角度看待信号
1.信号在没被发送之前,进程是认识这个信号。
2.在接受到信号之后,进程是被设定好去怎么处理这个信号的。
3.信号到来的时候,如果进程有更重要的事情要做,这个信号会被临时保存。
4.收到信号之后可以不立即处理,等到机会合适在处理信号。
5.信号产生是不定时,随时都可能接受到信号,所以信号是异步发送的,是别的用户和进程。
为什要有信号呢?
操作系统要求进程有对外部信号响应的能力。(例:该进程发生除0错误,这个时候操作系统就会给进程发信号,让其停止)。
进程接受信号的过程
1.信号的产生
信号是如何产生的呢?
1.1kill命令产生信号
1-34都是标准信号,34之后的是实时信号。
其中每个数字都是一个宏,使用kill命令可以 kill -9 也可以 kill -SIGKILL
1.2键盘产生信号
ctrl + c 和 ctrl + \
信号捕捉:当我们向进程发送一个信号,进程接受信号后,会做出系统设定好的动作,
捕捉信号就是将这个信号的默认动作,改为自定义的动作。
signal(2,handler);
第一个参数就是要捕捉的信号,第二个参数为int,返回之为void的函数指针,捕捉到信号之后,就执行handler函数。
demo代码
大概意思就是进程收到2号信号时,会把2号信号的默认动作替换为handler函数。
#include <iostream>
#include <cerrno>
#include <cstring>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <signal.h>
using namespace std;
void handler(int sig)
{
cout<<endl;
cout<<"get a signal ,number is:"<< sig <<endl;//打印捕捉到的信号
exit(0);
}
int main()
{
signal(2,handler);//捕捉2号信号
while(true)
{
;
}
return 0;
}
把