信号
- 1.概念
- 2.接口
- 3.信号产生的过程
- 1.信号的产生
- 1.1信号的产生方式
- 2.信号的处理
- 3.信号的保存
- 阻塞信号
- 4.信号集操作函数
1.概念
信号量(Semaphore)是一个用于多线程或多进程同步的变量。它是操作系统提供的一种同步机制,用于控制多个线程或进程对共享资源的访问,防止出现竞态条件。
信号量本质是一个计数器,描述临界资源数量的计数器;
假如你要申请空间,信号量就会帮你判断这个空间是否还可以够使用,如果足够的话就会把空间给你。
2.接口
1.信号量集标识符
nsems:创建信号量的个数
2.删除信号量
3.信号量的PV操作(信号量本身的加减)
3.信号产生的过程
1.信号的产生
信号的产生都是由操作系统来完成的。
1.1信号的产生方式
1.kill命令
2.键盘产生:ctrl+c -> OS会把这个解释成2号信号,向目标进程发送,这也是为什么我们在运行代码的时候,ctrl +c可以直接终止进程的原因
3.系统调用
int kill(pid_t pid,int sig);
int raise(int sig): 对自己发送任意信号
void abort(void); 对自己发送指定信号
4.软件条件
给进程发送闹钟
int main()
{
alarm(1);
int cnt=0;
while(true)
{
cout<<"num: "<<cnt<<endl;
cnt++;
}
return 0;
}
补充:kiil -l 可以查看系统的常见信号
2.信号的处理
信号的处理方式——signal
a.默认动作
b.自定义处理信号—信号捕捉
c.忽略信号
并且信号是可以更改处理方式的。
捕捉信号
signal调用结束,handler不是立即执行的,要受到相应的信号,才会执行。
void handler(int signo)
{
cout<<"get a sig,number is: "<<signo<<endl;
exit(1);
}
int main()
{
signal(SIGINT,handler);
while(true)
{
cout<<"I am process,pid: "<<getpid()<<endl;
}
return 0;
}
忽略信号
signal(SIGINT,SIG_IGN);
3.信号的保存
我们碰到信号的时候,可以不立即处理它,但是这时候就我们需要把信号保存起来
这里,linux有core功能,这个功能是被默认关闭的。
开启core之后,如果我们的程序有异常,就会生成一个文件;
目的是:想通过core定位到进程为什么退出,以及哪一行退出。
做法:将进程在内存中的核心数据(与调试有关)转储到磁盘中形成core,core.pid文件;
core dump:核心转储
核心转储(Core Dump)是指在计算机系统中,当一个程序或进程崩溃时,操作系统会生成的一种文件,用于记录该程序或进程在崩溃时的内存状态。
它可以协助我们调试代码
为什么OS默认是关闭核心转储呢?
防止为止的core dump一直在生成文件,导致磁盘被写满。
信号从产生到递达的状态叫做信号未决
阻塞信号
阻塞信号也是一个位图,比特位的位置表示信号编号,比特位的内容,表示是否阻塞该信号
看这个表横着看
block:是否收到信号
pending:是否阻塞信号
handler:信号的处理方式
4.信号集操作函数
1.sigprocmask
2.sigpending()