当前位置: 技术问答>linux和unix
信号阻塞函数sigsuspend()的使用。
来源: 互联网 发布时间:2017-03-10
本文导语: 本帖最后由 rbf926 于 2012-08-19 22:50:09 编辑 调用后sigsuspend(&waitmask),信号SIGINT被屏蔽。执行程序后,输入ctrl+c(SIGINT),没有标准输出, 但继续输入ctrl+(SIGQUIT)后,会同时输出“quit signal”和“interrupt”。这是为什么? #i...
但继续输入ctrl+(SIGQUIT)后,会同时输出“quit signal”和“interrupt”。这是为什么?
#include
#include
#include
#include
void sig_int(int);
volatile sig_atomic_t quitflag=0;
int main()
{
sigset_t newmask,waitmask,oldmask;
signal(SIGINT,sig_int);
signal(SIGQUIT,sig_int);
sigemptyset(&waitmask);
sigaddset(&waitmask,SIGINT);
sigemptyset(&newmask);
sigaddset(&newmask,SIGQUIT);
sigprocmask(SIG_BLOCK,&newmask,&oldmask);
while(quitflag == 0)
sigsuspend(&waitmask);
sigprocmask(SIG_SETMASK,&oldmask,NULL);
exit(0);
}
void sig_int(int signo)
{
if (signo == SIGINT)
printf("interruptn");
else if (signo == SIGQUIT)
{
//quitflag = 1;
printf("quit signaln");
}
return;
}
|
sigsuspend调用后放掉了SIGQUIT,阻塞了SIGINT.
所以,
你杀SIGINT, 安然不动, 信号被阻塞.
你杀SIGQUIT, 被处理, 设置了变量, sigsuspend返回.
sigsupend返回后放掉SIGINT, 阻塞SIGQUIT, 所以SIGINT信号被处理, 打印.
所以,
你杀SIGINT, 安然不动, 信号被阻塞.
你杀SIGQUIT, 被处理, 设置了变量, sigsuspend返回.
sigsupend返回后放掉SIGINT, 阻塞SIGQUIT, 所以SIGINT信号被处理, 打印.
|
sigsuspend的期间,你的waitmask是阻塞了SIGINT,,,所以你按下ctrl+c发出SIGINT信号后,
此信号处于未决状态。
然后你又发出SIGQUIT信号,此信号没被阻塞,,所以触发handler,,
然后根据上面的因为描述sigsuspend在handler返回后,也返回
前面没注意有个while(1)无限循环。。
注意: sigsuspend返回后,会恢复原来的阻塞情况,这时SIGINT没被阻塞,,而SIGQUIT被阻塞。
所以之前未决的SIGINT信号,在sigsuspend返回后,循环再次执行sigsuspend前,SIGINT会激活handler处理。
此信号处于未决状态。
然后你又发出SIGQUIT信号,此信号没被阻塞,,所以触发handler,,
然后根据上面的因为描述sigsuspend在handler返回后,也返回
前面没注意有个while(1)无限循环。。
注意: sigsuspend返回后,会恢复原来的阻塞情况,这时SIGINT没被阻塞,,而SIGQUIT被阻塞。
所以之前未决的SIGINT信号,在sigsuspend返回后,循环再次执行sigsuspend前,SIGINT会激活handler处理。