信号基础:

信号:
信号就是一个软中断,通知进程发生某件事情,打断进程当前的操作,去处理这个事件
功能:通知事件的发生
必须认识信号:信号不是立即处理的,而是先记录下来,选择一个合适的时机处理
信号有默认的处理方式,当然也可以改变。信号时可以被阻塞,暂时不处理
信号的生命周期:信号的产生-》信号在进程中的注册-》阻塞信号-》信号的注销-》处理信号
linux下信号的种类:62个信号–两类:非可靠信号/可靠信号 kill-l
信号的产生:
程序异常;硬件中断;软件条件
接口:kill raise abort alarm sigqueue
core dump:核心转储 进程异常退出时,保存进程的运行数据及调用栈信息,便于事后调试;
默认关闭:占用资源,数据安全
信号在进程中的注册:将信号记录在进程中
task_struct{
struct sigpending{
sigset_t pending;
struct sigqueue*;

}
//pend:没有被处理的信号
信号在进程中注册的流程:向pcb中添加相应信号的sigqueue节点,并且修改pengding位图,标记有这个信号需要被处理;
信号的注册:
非可靠信号:若位图为0,则添加节点,修改位图;若位图为1,则什么都不做(第二次到来的相同的信号被丢弃了)
注销就是删除节点,修改位图为0
可靠信号:不管位图是否为1,信号每次注册的时候都要添加新节点;
删除一个节点,若仍有相同信号节点,则不修改位图,否则修改位图为0

信号的处理:
默认处理方式—系统中已经定义好的如何处理这个信号所对应的事件
忽略处理 ----信号不注册
自定义处理方式 自己定义信号的回调函数,修改handle函数指针数组对应信号下标的函数地址
信号的捕捉流程:主要针对自定义信号处理方式:
信号并不是注册后立即被处理,而是选择一个合适的时机
哪种方式可以实现用户态到内核态的切换:
系统调用+异常+中断
例如:write read 异常
在这里插入图片描述
阻塞:暂时阻止信号被递达;pcb中有一个blocked信号位图,这个位图用于标记哪些信号被阻塞
sigset_t blocked real_blocked5
信号的递达:一个动作,描述的是信号的处理
信号的未决:一种状态,描述的是信号从注册到处理之前的状态
操作:sigprocmask

重入/不可重入函数:竞态条件
如果一个函数在多个执行流的竞态条件下运行,如果多个执行流的争抢执行不会对其他执行流造成影响,这个函数就称之为可重入函数,否则就称之为不可重入函数;
如果一个函数内部涉及到对全局数据的操作修改,并且这个操作是不受保护的,非原子的,那么这个函数就是一个不可重入函数,否则就是可重入函数,
意味着以后我们写函数的时候就一定要考虑函数的重入与不可重入问题;

volatile:是一个关键字,用于修饰一个变量,保持这个变量的内存可见性,防止编译器过度优化;

SIGCHLD信号:
僵尸进程是怎么产生的?
为了避免僵尸进程是创建了子进程之后就进行进程等待,一直等待是因为不知道什么时候操作系统的通知才能过来,因此一直等待;如果知道子进程的退出通知什么时候到来那就不需要一直等待了;操作系统通知父进程其实就是通过SIGCHLD信号通知的;
自定义SIGCHLD信号的处理方式,在处理方式中waitpid回收资源

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值