- 论坛徽章:
- 0
|
最近再看信号处理这块,遇到了些麻烦。先上我的测试代码吧,代码功能很简单,就是测试sigaction的阻塞,预期的结果是当按下ctrl+c发出SIGINT信号时,打印“SIGINT receive signal ”,紧接着按下ctrl+\发出SIGQUIT信号(两次按键小于3秒,也就是说进程正在处理SIGINT信号,即inter函数中),SIGQUIT信号会被阻塞,打印“SIGQUIT is blocked”,最后才打印“SIGQUIT receive signal ”。
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
void inter(int signo);
void quit(int signo);
int main(int argc, char **argv)
{
sigset_t blockset, oldblockset;
struct sigaction act, oldact, act1, oldact1;
sigemptyset(&act.sa_mask);
sigemptyset(&act1.sa_mask);
act.sa_sigaction = inter;
act1.sa_sigaction = quit;
sigaddset(&act.sa_mask, SIGQUIT);
if(sigaction(SIGINT, &act, &oldact) < 0)
{
write(STDOUT_FILENO, "install error!", 30);
exit(1);
}
if(sigaction(SIGQUIT, &act1, &oldact1) < 0)
{
write(STDOUT_FILENO, "install error!", 30);
exit(1);
}
sleep(10);
/*if(sigpending(&blockset) != -1)
if(sigismember(&blockset, SIGQUIT))
printf("SIGQUIT is blocked\n");
else if(sigismember(&blockset, SIGINT))
printf("sigint signals blocked\n");
else
printf("others signals\n");
*/
exit(1);
}
/*process the signal*/
void inter(int signo)
{
printf("SIGINT receive signal %d \n",signo);
sleep(3);
{
sigset_t blockset;
sigemptyset(&blockset);
if(sigpending(&blockset) != -1)
if(sigismember(&blockset, SIGQUIT))
printf("SIGQUIT is blocked\n");
}
}
void quit(int signo)
{
printf("SIGQUIT receive signal %d \n",signo);
sleep(3);
}
红色部分代码是用来显示SIGQUIT阻塞情况的,我放在了不同位置,放在inter函数内的时候,打印的结果符合我预期的结果
SIGINT receive signal 2
SIGQUIT is blocked
SIGQUIT receive signal 3
但是当我放置在main中时出现的结果
SIGINT receive signal 2
SIGQUIT receive signal 3
others signals
高手能帮忙解释下么? |
|