免费注册 查看新帖 |

Chinaunix

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

[函数] APUE中sigpending代码解释不了解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-06 10:25 |只看该作者 |倒序浏览
AUPE第二版的10.13节中讲到 sigpending 函数,对下面的这段代码不了解

#include "apue.h"
static void sig_quit(int);

int main(void)
{
    sigset_t    newmask, oldmask, pendmask;

    if (signal(SIGQUIT, sig_quit) == SIG_ERR)
        err_sys("can't catch SIGQUIT");
    /*
     * Block SIGQUIT and save current signal mask.
     */

    sigemptyset(&newmask);
    sigaddset(&newmask, SIGQUIT);
&nbsp;&nbsp;&nbsp;&nbsp;if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys("SIG_BLOCK error");

&nbsp;&nbsp;&nbsp;&nbsp;sleep(5);   /* SIGQUIT here will remain pending */
&nbsp;&nbsp;&nbsp;&nbsp;if (sigpending(&pendmask) < 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys("sigpending error");
&nbsp;&nbsp;&nbsp;&nbsp;if (sigismember(&pendmask, SIGQUIT))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\nSIGQUIT pending\n");

&nbsp;&nbsp;&nbsp;&nbsp;/*
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* Reset signal mask which unblocks SIGQUIT.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/

&nbsp;&nbsp;&nbsp;&nbsp;if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys("SIG_SETMASK error");
&nbsp;&nbsp;&nbsp;&nbsp;printf("SIGQUIT unblocked\n");

&nbsp;&nbsp;&nbsp;&nbsp;sleep(5);   /* SIGQUIT here will terminate with core file */
&nbsp;&nbsp;&nbsp;&nbsp;exit(0);
}

static void sig_quit(int signo)
{
&nbsp;&nbsp;&nbsp;&nbsp;printf("caught SIGQUIT\n");
&nbsp;&nbsp;&nbsp;&nbsp;if (signal(SIGQUIT, SIG_DFL) == SIG_ERR)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err_sys("can't reset SIGQUIT");
}

代码输出:
SIGQUIT pending          after return from sleep
caught SIGQUIT           in signal handler
SIGQUIT unblocked        after return from sigprocmask


在 if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)这句代码中已经讲SIGQUIT信号阻塞了,在未解除阻塞之前这么还会捕
获到SIGQUIT这个信号呢.

论坛徽章:
0
2 [报告]
发表于 2009-05-06 10:28 |只看该作者
补充一下,AUPE中对这个情况的解释是SIGQUIT在进程睡眠期间产生,这个信号现在是未决的并且是非阻塞的,所以它会在sigprocmask 函数返回之前递送给该进程.
If we generate the quit signal during this sleep period, the signal is now pending and unblocked, so it is delivered before sigprocmask returns.

在sleep之前进程该信号都已经阻塞了呀,怎么还说是非阻塞

论坛徽章:
0
3 [报告]
发表于 2009-05-06 10:37 |只看该作者
你没有搞懂吧,是这句if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) unblock后才收到的sigquit,因为sigprocmask是一个系统调用,在从它返回用户空间时内核会去检查信号的,这时,sigquit已经可以处理了,于是就马上处理后才回到用户空间执行那句printf("SIGQUIT unblocked\n");当然就是你看到的输入顺序了

[ 本帖最后由 bobozhang 于 2009-5-6 10:38 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-05-06 10:39 |只看该作者
是这样的:在信号被阻塞期间发送给进程的信号会被推迟发送,直到进程解除对某信号的阻塞,这时候信号才会到来
请看apue p269页
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP