免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2249 | 回复: 4
打印 上一主题 下一主题

[C] 来自sigaction中关于阻塞的困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-11 19:59 |只看该作者 |倒序浏览
最近再看信号处理这块,遇到了些麻烦。先上我的测试代码吧,代码功能很简单,就是测试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


高手能帮忙解释下么?

论坛徽章:
0
2 [报告]
发表于 2009-03-11 21:31 |只看该作者
你是不理解放在main中的情况,还是放在SIGINT处理函数内部的情况呢

论坛徽章:
0
3 [报告]
发表于 2009-03-11 21:48 |只看该作者
不知道为什么放在main中不会显示预期的结果

论坛徽章:
0
4 [报告]
发表于 2009-03-12 19:10 |只看该作者
你设置信号处理函数的设置的掩码只在信号处理函数里起作用啊

论坛徽章:
0
5 [报告]
发表于 2009-03-12 20:05 |只看该作者
哦,原来是这样的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP