京东商城网站风格,创个网站怎么弄,网站logo显示,重庆地区专业做网站的公司sigaction 信号捕捉
它也是信号捕捉#xff0c;不仅能处理普通信号还能处理实时信号#xff0c;但我们不管实时信号 我们发现函数名和形参中结构体名一样都是sigaction#xff0c;这在c/c中允许吗#xff1f; 不建议#xff0c;但是可以
signo你要捕捉几号信号 输入型参…sigaction 信号捕捉
它也是信号捕捉不仅能处理普通信号还能处理实时信号但我们不管实时信号 我们发现函数名和形参中结构体名一样都是sigaction这在c/c中允许吗 不建议但是可以
signo你要捕捉几号信号 输入型参数act结构体里面包含了你要设置新的动作输出型参数oact是保存老的设置以便你后续恢复 看看sigaction结构体里面红线是我们不关心的里面有个sa_handler不就是之前信号捕捉的函数指针类型吗也就是处理方法其实也就是修改了handler表里面的方法 这个结构体红线你都不关心那直接用memset都清零就可以
问题 1、结构体中sa_mask什么鬼
2、如果要处理一个信号了进程的pending位图里面对应信号是1这个1是在信号处理前清零还是信号处理后清零 你都能捕捉了你在捕捉里面打印看看Pending表就知道了如果信号处理方法中打印出来2号信号是0那么说明在信号处理前pending中信号就已经被清零了 所以结论pending位图什么时候从1-0. 执行信号捕捉方法之前先清0在调用
一个事实当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来 的信号屏蔽字这样就保证了在处理某个信号时,如果这种信号再次产生,那么 它会被阻塞到当前处理结束为止 也就说不允许同一个信号不断向我的进程发让我进程不断忙于各种信号处理
如果没有这个事实的话 在信号捕捉方法中也就是自定义动作函数中 1.函数中可以陷入内核因为函数中会被调度 或者 系统调用而且这很正常我调个printf访问硬件你不给我系统调用吗 2.如果再来一个2号信号这是可以的因为你处理前就把pending表2号由1变0所以正在处理2号信号还能再接收2号信号 所以此时很尴尬我们正在对2号进行捕捉又来一个2号信号又陷入方法函数中继续再进行捕捉 相当于对handler方法不断的重复调用如果一直这么调用那连信号捕捉我还返回不了了 OS不允许你这么干。
那怎么证明信号捕捉时2号信号确实是被屏蔽了呢 我们让捕捉函数中死循环打印pending表一直处理2号信号此时我们在发送一次2号信号如果被屏蔽就会看到2号信号由0置1 证明完成 所以OS不允许对同一种信号进行不断嵌套式的捕捉它的捕捉层数只能是一层任何一个信号都是如此
所以struct sigaction结构体中sa_mask是干什么的呢 如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需 要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字。
正在处理2号信号期间只有2号会被自动屏蔽。 如果我还想屏蔽更多信号呢?? ?那就利用这个sa_mask设置 最后说一下 所以处理一个信号期间如果我再收到10个同样的信号最终这个信号只会被记录一次因为只有一个pending位图哦 可重入函数