信号的捕捉以及sleep的模拟实现


一 对信号捕捉的认识·
对于一个信号的处理方式有三种
1  对信号胡略
2  执行该信号的默认处理动作
3  提供一个信号处理函数,操作系统处理该信号时执行自定义的动作

捕捉信号就是第三种,捕捉信号时要使用signal函数,为了做到这一点内核要在某种信号发生时调用函数handler。在用户函数中可

以执行用户的自定义函数。SIGKILL和SIGSTOP不能捕捉。

捕捉信号的处理过程,如上图所示共有四个用户态与内核态的切换
1 正在运行的进程收到了中断或者异常,或者系统调用时会从用户态切换到内核态
2 当内核处理完异常或者中断时不会立即返回用户态,再返回用户态时会检查进程PCB中的pending表,如果pending表中还有未递达的信号,会先处理未递达的信号。如果信号的处理动作是执行用户自定义的动作,则会从内核态切换到用户态执行用户自定义的handle函数。
3 在系统处理完handle函数时系统执行特殊的系统调用的sigreturn从用户态切换到内核态。
4 处理完sigreturn后系统会从内核态返回用户态main函数中上次被中断的地方继续执行

二 模拟实现sleep


1 简单模拟sleep代码如下

实现结果


函数的实现过程

1 main函数调用mysleep函数,mysleep函数中调用了SIGALRM信号的处理函数myhandle

2 调用alarm设定闹钟,调用pause等待。内核切换到别的进程运行

3alarm timeout之后,内核发送SIGDALRM给这个进程。

4 从内核切换到用户态时检查pengding表发现还有一个SIGALRM信号未处理,处理该信号。进入到用户自定义的myhandler函数,

进入myhandler时SIGALRMXIN信号被屏蔽,执行完myhandler函数返回时解除屏蔽。

5系统调用sigreturn返回内核态,然后切换到用户态执行主函数,这个时候pause返回-1,alarm(0)解除闹钟,调用sigaction恢复SIGALRM处理之前的动作











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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值