- 论坛徽章:
- 0
|
本帖最后由 davidmalone 于 2011-08-31 22:42 编辑
1- signal(SIGX,func1);
- signal(SIGX,func2);
- //其中SIGX为某个信号
- 另外signal/sigaction函数对信号能捕捉几次?
- 比如捕捉SIGX信号返回后,又出现一次SIGX信号,还会继续捕捉吗?
- 2[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
- int main()
- {
- struct sigaction action;
复制代码 ///此时action.sa_handler的值是什么? 也就是声明一个 struct sigaction变量里有默认值?
- sigaction(SIGABRT,NULL,action)
复制代码 ///此时action.sa_handler的值是什么?我在ubuntu下测了这时变为 SIG_DFL,为什么//会变成SIG_DFL?
4APUE里的abort函数
- 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递交之后才能触发sigaction函数执行从而取得&action吧?
///////////而下面开始判断action的内容,action不是要sigaction函数执行后才获得一个sigaction结构体的指针吗?怎么还没收到信号就开始判断了?
- if (action.sa_handler == SIG_IGN) {
- action.sa_handler = SIG_DFL;
- sigaction(SIGABRT, &action, NULL);}
复制代码 //////这里加入if判断为真,就有两个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 */
- /*
- * 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 ... */
- }
复制代码 [/code]5 APUE里的会议首进程到底和控制终端有连接没,好像一下子又说有,一下子又说没有 |
|