当前位置: 技术问答>linux和unix
信号程序问题
来源: 互联网 发布时间:2016-12-19
本文导语: 我先屏蔽了信号SIGUSR1,使程序休眠15秒,在这15秒内向程序发送SIGUSR1应该没有反应,但是我还是收到catch SIGUSR1信号,是不是屏蔽时出了什么问题,还有点问题,是不是在休眠时发送信号休眠时间没到程序就不休眠了...
我先屏蔽了信号SIGUSR1,使程序休眠15秒,在这15秒内向程序发送SIGUSR1应该没有反应,但是我还是收到catch SIGUSR1信号,是不是屏蔽时出了什么问题,还有点问题,是不是在休眠时发送信号休眠时间没到程序就不休眠了,接着往下执行,谢谢大家指点一下
#include
#include
#include
void sigusr1_handler(int signo)
{
printf("catch SIGUSR1");
}
int main(void)
{
sigset_t sig_set;
if(signal(SIGUSR1, sigusr1_handler) == SIG_ERR)
{
perror("can not set handler for SIGUSR1");
exit(1);
}
sigemptyset(&sig_set);
sigaddset(&sig_set, SIGUSR1 - 1);
if(sigprocmask(SIG_BLOCK, &sig_set, NULL) == -1)
{
perror("fail to set signal-mask");
exit(1);
}
printf("SIGUSR1 is not available");
sleep(15);
if(sigprocmask(SIG_UNBLOCK, &sig_set, NULL) == -1)
{
perror("fail to set signal-mask");
exit(1);
}
printf("SIGUSR1 is available nown");
sleep(15);
return 0;
}
#include
#include
#include
void sigusr1_handler(int signo)
{
printf("catch SIGUSR1");
}
int main(void)
{
sigset_t sig_set;
if(signal(SIGUSR1, sigusr1_handler) == SIG_ERR)
{
perror("can not set handler for SIGUSR1");
exit(1);
}
sigemptyset(&sig_set);
sigaddset(&sig_set, SIGUSR1 - 1);
if(sigprocmask(SIG_BLOCK, &sig_set, NULL) == -1)
{
perror("fail to set signal-mask");
exit(1);
}
printf("SIGUSR1 is not available");
sleep(15);
if(sigprocmask(SIG_UNBLOCK, &sig_set, NULL) == -1)
{
perror("fail to set signal-mask");
exit(1);
}
printf("SIGUSR1 is available nown");
sleep(15);
return 0;
}
|
问题就出在减1上,把减1去掉试一下!
14楼的回复有问题:
6、最有趣的是我发现,13楼说的问题,减1或不减1效果竟然相同!
错了,减1和不减1差距很大!
楼主你可以再试一下!
14楼的回复有问题:
6、最有趣的是我发现,13楼说的问题,减1或不减1效果竟然相同!
错了,减1和不减1差距很大!
楼主你可以再试一下!
|
不是。因为你并没有给他设置默认处理函数或者ignore这个信号。所以,就算这个信号被block了,他还是会发送的。所以你就接收到了。
|
屏蔽信号不等于丢弃该信号,而是处于一种“pending”态。
pending态的信号,在不屏蔽了之后,就又收到了。
信号处于pending状态的时候,可以再修改这个信号的处理方式。不是信号就扔了。
pending态的信号,在不屏蔽了之后,就又收到了。
信号处于pending状态的时候,可以再修改这个信号的处理方式。不是信号就扔了。