关于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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28