+ -
当前位置:首页 → 问答吧 → 关于sigaction 和 会议首进程

关于sigaction 和 会议首进程

时间:2011-08-30

来源:互联网


1
C/C++ code

    signal(SIGX,func1);
    signal(SIGX,func2);
    //其中SIGX为某个信号



或者
C/C++ code

    sigaction(SIGX,&act1,&oact);
    sigaction(SIGX,&act2,&oact);


复制代码
是不是第二个signal/sigaction导致第一个不起作用?
另外signal/sigaction函数对信号能捕捉几次?
捕捉一次调用信号处理程序返回后还能捕捉吗?

2
C/C++ code

    sigaction(SIGX,&act1,&oact);
    sigaction(SIGX,&act2,&oact);


复制代码
假如&act1 和&act2 里的sa_mask设置不同
第一个sigaction将act1里sa_mask指定信号集加入当前进程的屏蔽字里
那第二个sigaction怎么处理act2的sa_mask指定的信号集?同样也加入当前信号屏蔽字?

另外,如果主线程用sigaction将sa_mask指定的信号集加入屏蔽字
同一进程中的其他线程受影响吗?

3
C/C++ code

    struct sigaction action;
    ///此时action.sa_handler的值是什么?

    sigaction(SIGABRT,NULL,action)
    ///此时action.sa_handler的值是什么?我在ubuntu下测了这时变为 SIG_DFL,为什么//会变成SIG_DFL?



4 APUE里的abort函数

C/C++ code

    void
    abort(void)         /* POSIX-style abort() function */
    {
        sigset_t           mask;
        struct sigaction   action;

        /*
         * Caller can't ignore SIGABRT, if so reset to default.
         */
        sigaction(SIGABRT, NULL, &action);
    ////////////这里为何用NULL,这表示接收到SIGABRT信号后不执行任何动作?
    ///////////而下面开始判断action的内容,action不是要sigaction函数执行后才获得一个sigaction结构体的指针吗?怎么还没收到信号就开始判断了?

        if (action.sa_handler == SIG_IGN) {
            action.sa_handler = SIG_DFL;
            sigaction(SIGABRT, &action, NULL);
    //////这里加入if判断为真,就有两个sigaction函数了,那后面的sigaction函数会把前面的sigaction函数给刷掉?让第一个sigaction不发挥功能?
    //////为何后面又有一个sigaction,kill发两次SIGABRT?
        }
        if (action.sa_handler == SIG_DFL)
            fflush(NULL);           /* flush all open stdio streams */

        /*
         * Caller can't block SIGABRT; make sure it's unblocked.
         */
        sigfillset(&mask);
        sigdelset(&mask, SIGABRT);  /* mask has only SIGABRT turned off */
        sigprocmask(SIG_SETMASK, &mask, NULL);
        kill(getpid(), SIGABRT);    /* send the signal */
    /////////这个时候第一个sigaction函数捕捉到SIGABRT信号,那么因为有NULL,所以信号捕捉函数为空,即不执行任何动作?然后action也赋值NULL???

        /*
         * If we're here, process caught SIGABRT and returned.
         */
        fflush(NULL);               /* flush all open stdio streams */
        action.sa_handler = SIG_DFL;
        sigaction(SIGABRT, &action, NULL);  /* reset to default */
        sigprocmask(SIG_SETMASK, &mask, NULL);  /* just in case ... */
        kill(getpid(), SIGABRT);                /* and one more time */
        exit(1);    /* this should never be executed ... */
    }



5 APUE里的会议首进程到底和控制终端有连接没,好像一下子又说有,一下子又说没有

作者: davidmalone   发布时间: 2011-08-30


无终端的会话组长,可以重新申请打开一个控制终端,可以通过不再让进程成为会话组长的方式来禁止进程重新打开控制终端,需要再次调用fork函数

作者: zmlovelx   发布时间: 2011-08-30

信号都是进程的,第二次注册肯定是覆盖第一次的啊。信号也不会排队,若干个只会给用户返回一个。

作者: qq120848369   发布时间: 2011-08-30