《unix高级环境编程》信号——sigsuspend 函数
来源:互联网 发布:音乐剪辑软件绿色版 编辑:程序博客网 时间:2024/05/18 10:11
sigsuspend 函数
更改进程的信号屏蔽字可以阻塞所选择的信号,或解除对它们的阻塞,使用这种技术可以保护不希望由信号中断的代码临界区。如果希望对一个信号解除阻塞,然后pause 等待以前被阻塞的信号发生,就是把“解除信号屏蔽”和“挂起等待信号”这两步能合并成一个原子操作。sigsuspend 函数能够实现该功能,即包含了pause的挂起等待功能,同时临时解除对某个信号的屏蔽。以下是该函数的原型:
#include <signal.h>int sigsuspend(const sigset_t *sigmask);//返回值:-1,并将errno设置为EINTR;
跟 pause 一样,sigsuspend 没有成功返回值,只有执行了一个信号处理函数之后sigsuspend 才返回,返回值为-1,并将errno 设置为 EINTR。调用 sigsuspend 时,进程的信号屏蔽字由sigmask 参数指定,可以通过指定sigmask 来临时解除对某个信号的屏蔽,然后挂起等待,当sigsuspend 返回时,进程的信号屏蔽字恢复为原来的值。
测试程序:
#include <signal.h>/*int sigsuspend(const sigset_t *sigmask);//返回值:-1,并将errno设置为EINTR;*/#include "apue.h"#include "pr_mask.h"static void sig_func(int signo);int main(void){ sigset_t newmask, oldmask, waitmask; pr_mask("Program start: "); if(signal(SIGINT,sig_func) == SIG_ERR) err_sys("signal error"); sigemptyset(&newmask);//初始化信号集 sigaddset(&newmask,SIGINT);//添加SIGINT信号 sigemptyset(&waitmask); sigaddset(&waitmask,SIGUSR1); //屏蔽信号 /* * Block SIGINT and save current signal mask */ if(sigprocmask(SIG_BLOCK,&newmask,&oldmask) < 0) err_sys("SIG_BLOCK error"); pr_mask("in critical region: "); //临时修改进程信号屏蔽字,在捕捉信号之前,将进程挂起等待 /* * pause, allowing all of signals except SIGUSR1 */ if(sigsuspend(&waitmask) != -1) err_sys("sigsuspend error"); pr_mask("after return from sigsuspend: "); /* * reset signal mask which unblocks SIGINT */ if(sigprocmask(SIG_SETMASK,&oldmask,NULL) < 0) err_sys("SIG_SETMASK error"); pr_mask("program exit: "); exit(0);}static void sig_func(int signo){ pr_mask("\nin sig_func: ");}输出结果:
$ ./sigsuspendProgram start: in critical region: SIGINT^Cin sig_func: SIGINTSIGUSR1after return from sigsuspend: SIGINTprogram exit:
- 首先设置信号 SIGINT为信号屏蔽字进行阻塞;
- 当程序执行了 sigsuspend 后,临时使 SIGUSR1 成为信号屏蔽字进行阻塞,对 SIGINT 解除阻塞,并且挂起进程,等待信号输入;
- 我们在终端中输入ctrl-C ,即输入一个中断信号,进程捕捉到中断信号,调用捕捉函数sig_func 进行处理,处理完中断信号后sigsuspend 函数返回-1。此时,进程的信号屏蔽字恢复为原来的值SIGINT;
参考资料:
《UNIX高级环境编程》
0 0
- 《unix高级环境编程》信号——sigsuspend 函数
- 《unix高级环境编程》信号——sigsuspend 函数
- UNIX环境高级编程——sigqueue、sigsuspend函数
- 《UNIX环境高级编程》笔记--sigsuspend函数
- unix 环境高级编程之sigsuspend函数
- 《UNIX环境高级编程》笔记--sigsuspend函数
- 《UNIX环境高级编程》笔记--sigsuspend函数
- Unix环境高级编程(阅读笔记)----sigsuspend函数
- 《unix环境高级编程》信号——sigaction 函数
- 《unix环境高级编程》信号——sigaction 函数
- 【UNIX环境高级编程】信号安全——可重入函数
- UNIX环境高级编程——信号
- UNIX环境高级编程——信号
- 《unix高级环境编程》信号——信号基本概述
- 《unix高级环境编程》信号——信号集
- 《unix高级环境编程》信号——信号基本概述
- 《unix高级环境编程》信号——信号集
- 《unix环境高级编程》信号——sigsetjmp 函数和 siglongjmp 函数
- 2014青岛理工大学ACM邀请赛总结
- Servet Filter Listener 详解
- 2014-11-8Android学习-------AnimationListener方法-------动画Animation学习篇
- Linux stat函数讲解:
- POJ 2420 A Star not a Tree? (模拟退火)
- 《unix高级环境编程》信号——sigsuspend 函数
- 爱的送大炮打破爱动啊堤坡阿斯顿破安排都I啊
- Android中的context
- Python 2.x 中的 String 与 Unicode
- Unity3D技术之Visual Studio C# 集成说明
- Android:Activity之间跳转时停止运行的一种解决办法
- 类的组合
- OMNET++错误解决
- 圣诞节发生的实际开发设计的反抗精神