信号

什么是信号

生活当中有很多信号,例如:红绿灯,上课铃声。

本质:操作系统向进程发信号,也就是写信号,是操作系统在修改进程PCB中的位图(进程的PCB中会维护一个数据结构,位图,来存放信号,比特位的位位置代表信号的编号,比特位的内容代表信号有无)。

处理:收到信号不会马上处理,而是在合适的时候

kill -l

查看信号
在这里插入图片描述
信号种类 — 62种

两大类:

非可靠信号: 1~31 有可能造成事件丢失(如果进程对某个信号进行处理时,这个信号发生多次,但是进程只处理了一次)

可靠信号: 34 ~64 不会造成事件丢失

信号处理方式

  1. 忽略此信号
  2. 执行该信号的默认处理动作
  3. 捕捉:提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数。

signal

用于信号捕捉,可以修改默认信号

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<signal.h>
  4 #include<unistd.h>
  
  6 void handler(int signo)
  7 {
  8
  9     printf("catch sig, signo: %d\n", signo);
 10 }
 11 int main()
 12 {
 13     int i = 1;
 14     while(i<=31)
 15     {
 16         signal(i,handler);
 17         i++;
 18     }
 19     while(1)
 20     {
 21         printf("I am a process...\n");
 22         sleep(1);
 23     }

在这里插入图片描述
但是 19 18 9号信号不可被修改
在这里插入图片描述

阻塞信号

在这里插入图片描述
block 标明是否被阻塞。阻塞了则为1,未被阻塞则为0。
pending 标明进程是否收到某个信号,收到了则为1,没有收到则为0。
handler 标明对该信号的处理动作。

信号的处理动作分三种:(SIG_IGN)忽略、(SIG_DEL)执行系统默认操作(通常是终止进程)、用户对信号捕捉后进行自定义处理。

信号一旦被阻塞,即使收到该信号,也不会递达。

信号捕捉

在这里插入图片描述
内核返回用户时进行信号处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值