免费注册 查看新帖 |

Chinaunix

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

APUE信号问题!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-18 09:09 |只看该作者 |倒序浏览
读APUE(第二版),其中关于信号的一个例程:

#include    <signal.h>
#include    "apue.h"

volatile sig_atomic_t   quitflag;   /* set nonzero by signal handler */

int
main(void)
{
    void        sig_int(int);
    sigset_t    newmask, oldmask, zeromask;

    quitflag =0;
    printf("quitflag=%d",quitflag);
    if (signal(SIGINT, sig_int) == SIG_ERR)
        err_sys("signal(SIGINT) error");
    if (signal(SIGQUIT, sig_int) == SIG_ERR)
        err_sys("signal(SIGQUIT) error");

    sigemptyset(&zeromask);

    sigemptyset(&newmask);
    sigaddset(&newmask, SIGQUIT);
                    /* block SIGQUIT and save current signal mask */
    if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
        err_sys("SIG_BLOCK error");

    while (quitflag == 0)
        sigsuspend(&zeromask);

    /* SIGQUIT has been caught and is now blocked; do whatever */
    quitflag = 0;
                    /* reset signal mask which unblocks SIGQUIT */
    if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
        err_sys("SIG_SETMASK error");

    exit(0);
}

void
sig_int(int signo)  /* one signal handler for SIGINT and SIGQUIT */
{
    if (signo == SIGINT)
        printf("\ninterrupt\n");
    else if (signo == SIGQUIT)
    {
        printf("\nquit\n");
        quitflag = 1;   /* set flag for main loop */
    }
    return;
}

问题1,volatile sig_atomic_t   quitflag,这个变量初始化的时候,就是0值么??
问题2,我在linux下编译运行,然后运行期间送出一个“ctrl+\”(quit)信号,但是要求打印的printf("quitflag=%d",quitflag)语句为什么在我发送出quit信号之后才打印呢??按道理来说,应该是最先打印的。
帮忙看看。

论坛徽章:
0
2 [报告]
发表于 2007-04-18 11:18 |只看该作者
abstruseness

论坛徽章:
0
3 [报告]
发表于 2007-04-18 11:19 |只看该作者
praise

论坛徽章:
0
4 [报告]
发表于 2007-04-18 11:49 |只看该作者
原帖由 rxpmcb 于 2007-4-18 11:18 发表
abstruseness


为什么??
能否给个明确的解释!!

论坛徽章:
0
5 [报告]
发表于 2007-04-18 12:20 |只看该作者
1 对,内核初始化为0
2 printf("quitflag=%d",quitflag);
  缓冲问题,高级编程上有介绍

论坛徽章:
0
6 [报告]
发表于 2007-04-18 12:31 |只看该作者
原帖由 lsmup 于 2007-4-18 12:20 发表
1 对,内核初始化为0
2 printf("quitflag=%d",quitflag);
  缓冲问题,高级编程上有介绍


哦。有道理。
多谢。再仔细看看!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP