信号(上):信号的简单介绍,阻塞信号集和未决信号集,系统关于信号的函数kill,raise,abort,alsrm时钟信号,setitimer函数,捕捉函数signal,setitimer实现alar

信号的概念:由内核发出并处理
信号四要素
⦁ 编号
⦁ 名称
⦁ 时间
⦁ 默认处理动作

  • 终止
  • 忽略
  • 终止,产生
  • 暂停,继续

信号的特点

  • 简单

  • 不能携带大量信息

  • 特定条件下产生

信号也叫软中断,可能会有延迟
信号的处理方式:
⦁ 执行默认动作
⦁ 捕捉
⦁ 忽略

9.19号信号不能捕捉,不能忽略,甚至不能阻塞
阻塞信号集(信号屏蔽字)和未决信号集:要想理解信号函数,先理解未决信号集与阻塞信号集的动态关系
在这里插入图片描述
在最后我再就未决信号集和阻塞信号集(信号屏蔽字)总结一下:
每个进程有一个默认的未决信号集(未被处理的信号)位图,位图表示前31位信号是否被处理,0代表处理完成,1代表未处理,一般不设置阻塞信号集的情况下,31号信号到来都会被处理,一般的收到一个信号,则将这个信号的位图置1,等到信号处理完毕则再将位图置0。(动态变化的未决信号位图,因为未决信号就是未处理的信号,然而计算机处理的速度是极快的)不能人为设置未决信号,但是有一个阻塞信号集,阻塞信号集却可以人为去设置,并且会影响未决信号集。举例:假如在阻塞信号集中将2号位图置1,那么再当2号信号来的时候,未决信号将2号位置1准备处理 ,但是阻塞信号集好像一堵墙挡在未决信号集前面,未决信号集就没办法处理这个2号信号,那么未决信号集2号位一直为1,直到解除阻塞信号集的设置

一句话阻塞信号集影响未决信号集

阻塞信号集中的位图为1的信号不能影响进程(例如ctrl +c 并不能使进程终止,因为你信号被阻塞,没有被处理),未决信号集并不是在阻塞信号集设置完毕位图就发生变化,而是当设置完毕并接收到信号的时候才会置1,但是并没有去处理信号

系统api产生函数
kill函数
int kill(pid_t pid, int sig);
pid:
⦁ > 0指定进程
⦁ pid = 0当调用进程组内的所有进程
⦁ pid = -1代表有权限发送的所有进程
⦁ pid < 0 代表-pid对应的组内所有进程
sig:对应的信号代号

在父进程中杀死指定子进程

在这里插入图片描述
注意有一个父进程保存子进程pid的技巧
在子进程中杀死父进程
在这里插入图片描述
raise:用来自杀的函数
int raise(int sig);
在这里插入图片描述
abort:自杀
void abort(void);
在这里插入图片描述
时钟信号:alsrm定时给自己进程发送SIGALRM信号(14号信号)
unsigned int alarm(unsigned int seconds);
second: 几秒钟后发送信号
返回值:上次闹钟剩余的秒数,要是传入信号为0则代表取消闹钟
这个不好理解需要说明一下,意思就是在闹钟未触发之前,如果再来一个alarm函数,那么上一个闹钟将返回剩余秒数,然后就会继续执行新的alarm
还有一种就是在第一个闹钟未触发之前,要是再收到alarm信号传入参数是0,则代表取消闹钟
在这里插入图片描述
setitimer的使用:
int setitimer(int which, const struct itimerval *new_value,
struct itimerval *old_value);
参数:
which三种参数
在这里插入图片描述
⦁ 自然定时
⦁ 计算进程执行时间
⦁ 进程执行时间+调度时间
习惯用第一个时间,三种时间使用的信号不一样,具体参考man setitimer
在这里插入图片描述
一个结构体,这个结构体中又包含一种结构体,类型已给出,下面是示意

在这里插入图片描述
new_value:要设置的闹钟时间
old_value:原闹钟时间
返回值:成功返回0 ,失败返回-1
举例:先用setitimer实现alarm功能
在这里插入图片描述
捕捉函数(简单介绍):
typedef void (*sighandler_t)(int);//函数指针
sighandler_t signal(int signum, sighandler_t handler);
参数: signum 信号的宏或者序列号
handler 调用的函数
意思就是捕捉到这个序列的信号就调用函数
在这里插入图片描述
setitimer实现alarm:
在这里插入图片描述
在这里插入图片描述
通过数据发现,setitimer函数第三个参数好像是一个会随着时间的推移自己倒数原闹钟时间的一个参数,每次打印出来的秒数正好是上次闹钟剩余秒数,毫秒存在误差是因为代码运行消耗

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值