当前位置: 技术问答>linux和unix
求解信号阻塞后还能打断系统调用是为什么
来源: 互联网 发布时间:2016-12-19
本文导语: 我用signal设置了一个SIGALRM信号处理函数timer_handler(),然后用setitime设置了100ms产生一次SIGALRM信号,此时程序运行一切正常,timer_handler()执行也正常。 但是当我用sigprocmask()阻塞SIGALRM信号(阻塞10 秒),发现timer_handler(...
我用signal设置了一个SIGALRM信号处理函数timer_handler(),然后用setitime设置了100ms产生一次SIGALRM信号,此时程序运行一切正常,timer_handler()执行也正常。
但是当我用sigprocmask()阻塞SIGALRM信号(阻塞10 秒),发现timer_handler()还是每100ms执行一次,而且进程里的一个线程中的msgrcv()调用开始每100ms返回一次-1(就是被信号打断了,因为使用signal所以没有设置重启调用),我想问问有人知道是为什么吗?信号没阻塞前msgrcv()没被打断过,阻塞了反而被打断,而且信号处理函数还在执行?
本人接触LINUX时间很短,希望大家多多帮忙!
但是当我用sigprocmask()阻塞SIGALRM信号(阻塞10 秒),发现timer_handler()还是每100ms执行一次,而且进程里的一个线程中的msgrcv()调用开始每100ms返回一次-1(就是被信号打断了,因为使用signal所以没有设置重启调用),我想问问有人知道是为什么吗?信号没阻塞前msgrcv()没被打断过,阻塞了反而被打断,而且信号处理函数还在执行?
本人接触LINUX时间很短,希望大家多多帮忙!
|
第一: 每个线程都有自己的sigmask
第二: 子线程的初始sigmask继承自父线程
第三: 你自己看一下调用sigprocmask的时机是否正确。
第二: 子线程的初始sigmask继承自父线程
第三: 你自己看一下调用sigprocmask的时机是否正确。
|
明显你是先创建线程,再屏蔽信号滴。