在shell中捕捉信号的trap命令(2)
sigaction函数,该函数采用一个sigaction结构,除定义信号交付时要采取的动作外,还包含其他一些动作控制信息。
sigaction还允许调用进程检测或指定与特定信号相关的动作。
int sigaction(int sig, const struct sigaction* act, struct sigaction* oact);sig指定信号-除SIGKILL和SIGSTOP。
如果act为NULL,则不改变信号动作,只查询当前动作。
成功返回0,失败则不安装新信号动作,返回-1,设置errno。
struct sigaction{
void (*sa_handler)(int); // 同signal的第二参数func。
void (*sa_sigaction)(int, siginfo_t*, void*); // 仅当flags设置SA_SIGINFO起作用。
sigset_t sa_mask; // 指明信号执行期间要阻塞的一组信号,除此之外导致信号句柄执
行的信号也自动阻塞,除非指定了SA_NODEFER。信号句柄正常返回时,屏蔽恢复到原先状态。
int sa_flags; //
};
sa_flags是一个位串,可以通过或运算生成。可设置下列标志:
SA_NOCLDSTOP: 只对CHLD信号起作用,子进程暂停时不发信号给父进程。
SA_RESTART: 信号句柄返回时,自动恢复被该信号中断的系统调用。否则该系统调用将中断返回-1,并设置errno为EINTR。
SA_ONSTACK:
SA_RESETHAND:信号句柄入口,系统将重置信号动作为SIG_DFL.
SA_NODEFER:句柄执行期间,不自动阻塞该信号。
SA_NOCLDWAIT:只对CHLD起作用,调用进程的所有子进程在终止时不会成为Zombe。这种情况下,父进程无需要wait子进程,并且子进程终止也不向父进程发SIGCHLD信号。
如果父进程调用wait,将阻塞到所有子进程终止,并返回-1,errno设为ECHILD.
SA_SIGINFO:如果未设置此标志,则信号句柄原型为:
void func(int signo);
如果设置此标志,则句柄原型为:
void func(int signo, singinfo_t* info, void* context);
Info- 解释信号生成的原因。
Context-信号被交付时所中断进程的上下文。
一旦用sigaction为特定信号建立了动作,该动作就一直保持,直到另一次调用sigaction,或者调用exec,或者因设置了SA_RESETHAND导致系统自动改变动作为默认为止。
除了外部中断产生信号外,程序可以显式的调用raise函数给他自己发送信号,或调用kill向自己或其他进程发送信号。
阻塞信号意味着保持该信号并推迟它的交付,可以防止程序中的关键代码被信号中断。信号集操作:
int sigemptyset(sigset_t* set); // 清空信号集
int sigfillset(sigset_t* set); // 包含所有信号集
sigaddset/sigdelset/sigismember;
sigprocmask用来检测或改变调用进程的信号屏蔽。
int sigprocmask(int how, const sigset_t* set, sigset_t* oset);
How: SIGBLOCK SIG_UNBLOCK SIG_SETMASK
如果调用sigprocmask放开某个信号而导致任何悬挂信号被解除阻塞,则函数返回前,这些信号中至少有一个被交付。
检查悬挂信号:int sigpending(sigset_t* set);
等待信号:int pause(void);
悬挂调用进程直到有一个信号到达。仅当句柄执行并返回时,pause函数才返回:此时返回-1,并设置errno为EINTR。所有其他情况下pause不返回。
如果多个相同信号在信号句柄运行前发给了进程,则句柄只被运行一次。换句话说,默认情况下unix信号是非排队的,只有当实现支持实时信号并且sa_flags设置SA_SIGINFO时,由sigqueue生成的后续信号才排队。
I/O执行期间,有可能到达信号,此时有两种情况:重新开始系统调用还是返回失败.
早期unix特征为,进程执行慢系统调用期间捕获信号时,该调用被中断并设置errno为EINTR。
现代unix增加了sa_flags选项SA_RESTART可对单个信号要求自动恢复被中断的系统调用。
原则如下:如果进程阻塞于慢系统调用,并且进程捕获信号且该信号句柄返回,系统调用可能返回EINTR。 虽然有些unix能自动恢复系统调用,但是为了兼容性,我们必须准备慢系统调用返回EINTR,当检测到EINTR,要么重新开始系统调用,要么做其他处理。
Again:
if (n=read(fd,buff, BUFSIZE) < 0) {
if (errno ==EINTR)
goto Again;
else
…}
…… 此处隐藏:286字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [教育文库]夜场KTV服务员的岗位职责及工作流程[1]
- [教育文库]企划、网络、市场绩效考核方案
- [教育文库]学党史、知党情、强党性--“党的基本理
- [教育文库]2016年高考物理大一轮总复习(江苏专版
- [教育文库]干部廉洁自律自查自纠的报告
- [教育文库]2010年北京大学心理学系拟录取硕士研究
- [教育文库]资金时间价值练习题及答案
- [教育文库]保护环境的心得体会
- [教育文库]英语角内容:英语趣味小知识
- [教育文库]档案收集与管理工作通知
- [教育文库]劳动规章制度范本范本
- [教育文库]高考物理一轮复习课后限时作业1运动的
- [教育文库]机械工艺夹具毕业设计195推动架设计说
- [教育文库]通用技术教学比赛说课稿2
- [教育文库]2018年四年级英语下册 Module 7 Unit 2
- [教育文库]第2章 宽带IP网络的体系结构
- [教育文库]九年级化学第五单元课题3《根据化学方
- [教育文库]小学英语六年级情态动词用法归纳
- [教育文库]甲级单位编制窑井盖项目可行性报告(立
- [教育文库]2016-2021年中国城市规划行业全景调研
- 高考英语听力十大场景词汇总结
- 全省领导班子思想政治建设座谈会会议精
- 人教版新课标高一英语提优竞赛试题 下
- 江西省2014年生物中考试题
- 长沙镇食品药品安全事故应急预案
- 《金刚石、石墨和C60》片段教学设计
- 福州教育学院(王旭东)
- 基于EDA音乐播放器的设计
- 9、古诗两首《夜书所见》《九月九日忆
- 小学语文课外阅读有效策略探讨
- 贵州文化产业发展成支柱产业的问卷调查
- 膀胱类癌的诊治体会(附3例报告)
- 发动机积碳产生的原因
- Configuring Code Composer Studio for
- 学生良好的心理素质如何培养点滴谈
- 46 电沉积法制备锂离子电池用硅-锂薄膜
- 美舍雅阁公司管理中各部门职责
- 去壳剥皮的小妙招
- 六自由度运动平台的仿真研究
- Pride and Prejudice(傲慢与偏见)




