sigprocmask 阻塞进程
本系列文章由muge0913编写,转载请注明出处:http://blog.csdn.net/muge0913/article/details/7334771
1、有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数。这种情况是通过阻塞信号实现的。
2、信号阻塞和忽略信号的区别。
阻塞的概念和忽略信号是不同的。操作系统在信号被进程解除阻塞之前不会讲信号传递出去,被阻塞的信号也不会影响进程的行为,信号只是暂时被阻止传递。当进程忽略一个信号时,信号会被传递出去但进程会将信号丢弃。
3、信号阻塞系统调用,它们的都起到阻塞的作用,它们不是协作使用的。
- #include <signal.h>
- int sigprocmask(ubt how,const sigset_t*set,sigset_t *oldset);
- int sigsuspend(const sigset_t*sigmask);
sigprocmask设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞)。
参数:
how:用于指定信号修改的方式,可能选择有三种
SIG_BLOCK//将set所指向的信号集中包含的信号加到当前的信号掩码中。即信号掩码和set信号集进行或操作。
SIG_UNBLOCK//将set所指向的信号集中包含的信号从当前的信号掩码中删除。即信号掩码和set进行与操作。
SIG_SETMASK //将set的值设定为新的进程信号掩码。即set对信号掩码进行了赋值操作。
set:为指向信号集的指针,在此专指新设的信号集,如果仅想读取现在的屏蔽值,可将其置为NULL。
oldset:也是指向信号集的指针,在此存放原来的信号集。可用来检测信号掩码中存在什么信号。
返回说明:
成功执行时,返回0。失败返回-1,errno被设为EINVAL。
sigprocmask示例(演示添加信号掩码):
- #include <stdio.h>
- #include <signal.h>
- void checkset();
- void main()
- {
- sigset_tblockset;
- sigemptyset(&blockset);
- sigaddset(&blockset,SIGINT);
- sigaddset(&blockset,SIGTSTP);
- checkset();
- sigprocmask(SIG_SETMASK,&blockset,NULL);
- checkset();
- sigaddset(&blockset,SIGTERM);
- sigprocmask(SIG_BLOCK,&blockset,NULL);
- checkset();
- sigdelset(&blockset,SIGTERM);
- sigprocmask(SIG_UNBLOCK,&blockset,NULL);
- checkset();
- }
- void checkset()
- {
- sigset_tset set;
- printf("checksetstart:\n");
- if(sigprocmask(0,NULL,&set)<0)
- {
- printf("checksetsigprocmask error!!\n");
- exit(0);
- }
- if(sigismember(&set,SIGINT))
- printf("sigint\n");
- if(sigismember(&set,SIGTSTP))
- printf("sigtstp\n");
- if(sigismember(&set,SIGTERM))
- printf("sigterm\n");
- printf("checksetend\n");
- }
sigprocmask示例(演示添某部分代码不被信号打搅):
- #include <stdio.h>
- #include <signal.h>
- void checkset();
- void func();
- void main()
- {
- sigset_tblockset,oldblockset,pendmask;
- printf("pid:%ld\n",(long)getpid());
- signal(SIGINT,func); //信号量捕捉函数,捕捉到SIGINT,跳转到函数指针func处执行
- sigemptyset(&blockset); //初始化信号量集
- sigaddset(&blockset,SIGTSTP); //将SIGTSTP添加到信号量集中
- sigaddset(&blockset,SIGINT);//将SIGINT添加到信号量集中
- sigprocmask(SIG_SETMASK,&blockset,&oldblockset); //将blockset中的SIGINT,SIGTSTP阻塞掉,并保存当前信号屏蔽字
- /*执行以下程序时,不会被信号打搅*/
- checkset();
- sleep(5);
- sigpending(&pendmask); //检查信号是悬而未决的
- if(sigismember(&pendmask,SIGINT)) //SIGINT是悬而未决的。所谓悬而未决,是指SIGQUIT被阻塞还没有被处理
- printf("SIGINTpending\n");
- /*免打搅结束*/
- sigprocmask(SIG_SETMASK,&oldblockset,NULL); //恢复被屏蔽的信号SIGINT SIGTSTP
- printf("SIGINTunblocked\n");
- sleep(6);
- }
- void checkset()
- {
- sigset_tset;
- printf("checksetstart:\n");
- if(sigprocmask(0,NULL,&set)<0)
- {
- printf("checksetsigprocmask error!!\n");
- exit(0);
- }
- if(sigismember(&set,SIGINT))
- printf("sigint\n");
- if(sigismember(&set,SIGTSTP))
- printf("sigtstp\n");
- if(sigismember(&set,SIGTERM))
- printf("sigterm\n");
- printf("checksetend\n");
- }
- void func()
- {
- printf("hellofunc\n");
- }
sigprocmask 阻塞进程相关推荐
- Android AlertDialog对话框不能阻塞进程
因为AlertDialog对话框不能阻塞当前进程,如果在对话框后,有继续运行的代码,或有切换界面的代码,对话框会一闪而过,不等用户选择. 正确的做法应该是: if (条件){ AlertDialog ...
- c#中while(true)死循环阻塞进程,应该怎么办
我在用c#做一个读卡器,过程中需要点击button进行循环读卡,再点击另一个button停止,我一看到循环读卡就想到while(true)让他一直读,循环读卡的确可以实现,但是之后却无法跳出循环,导致 ...
- mysql 查阻塞_mysql检查阻塞进程
前言:朋友咨询我说执行简单的update语句失效,症状如下: mysql> update order_info set province_id=15 ,city_id= 1667 where o ...
- 线程的挂起是错误的概念实际是线程的阻塞,挂起只针对进程,将进程挂起会将进程从内存空间交换到磁盘空间的过程
线程的挂起是错误的概念实际是线程的阻塞 线程的主要状态有运行态,就绪态和阻塞态.挂起态对线程没有什么意义,这是由于此类状态是一个进程级的概念.特别地,如果一个进程被换出,由于它的所有线程都该进程的地址 ...
- 操作系统(二 )| 进程管理初探(前趋图、程序执行、进程的定义特征基本状态,进程的创建终止,阻塞唤醒,挂起激活)
文章目录 前趋图和程序执行 前趋图 程序的顺序执行 程序的并发执行 进程的定义和特征 进程的基本状态 就绪状态 运行状态 阻塞状态 挂起状态 进程控制块(PCB) 作用: 块中信息: PCB的组织方式 ...
- 进程控制:进程的创建、终止、阻塞、唤醒和切换
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程.撤销已有进程.实现进程状态转换等功能.在操作系统中,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不 ...
- 模拟进程创建、终止、阻塞、唤醒原语_操作系统第二章--进程的描述与控制
操作系统第二章--进程的描述与控制 前趋图和程序执行 前趋图 前趋图是一个有向无循环图DAG,用来描述进程之间执行的前后关系 初始结点:没有前趋的结点 终止结点:没有后继的结点 重量:表示该结点所含有 ...
- 用户态程序阻塞原因_进程阻塞 操作系统某种情况进行进程的阻塞和唤醒操作...
进程阻塞 1)请求系统服务.例如打印服务,进程在提出打印请求后,系统创建打印服务进程为该进程服务,而提出打印请求可能被阻塞起来等待打印的完成. 2)启动某种操作.例如,进程发出启动I/O或启动打印机的 ...
- 模拟进程创建、终止、阻塞、唤醒原语_轻松搞定进程原理
进程简介 并发和并行 并发:在一个时间段中多个程序都启动运行在用一个处理机中 并行:两个进程分别由不同的CPU管理执行,两个进程不抢占CPU的资源,且可以同时运行,叫做并行 区别在于是否同时 多进程的 ...
最新文章
- Mysql新安装服务启动失败
- 无锡朗贤获B+轮融资,辰韬资本、兴韬投资领投
- 16 BasicHashTable基本哈希表类(三)——Live555源码阅读(一)基本组件类
- 云计算机教室安装学生软件,新东方云教室1.6版本
- MFC SendMessage()函数传递字符串
- Istio 1.7——进击的追风少年
- sohu读博——周忆清
- Django - 路由系统
- android 实现论坛界面,android界面开发之主流UI布局范例
- Linux:JDK配置
- 指针 是否相同_【变电小课堂】MF47指针式万用表操作指南
- 2018年湘潭大学程序设计竞赛 E	吃货
- Win10更新后桌面右键反应慢的问题
- 下一代游戏主机,8GB内存怎么够
- 如何用二分查找法查找有序数组
- 尼康D500套机相机黑屏是怎么回事
- unity开发抽奖系统
- 使用node连接MongoDB的工具安装及配置
- VUE项目学习(一):搭建VUE前端项目
- 危险化学品事故爬虫解析