本系列文章由muge0913编写,转载请注明出处:http://blog.csdn.net/muge0913/article/details/7334771

1、有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数。这种情况是通过阻塞信号实现的。

2、信号阻塞和忽略信号的区别。

阻塞的概念和忽略信号是不同的。操作系统在信号被进程解除阻塞之前不会讲信号传递出去,被阻塞的信号也不会影响进程的行为,信号只是暂时被阻止传递。当进程忽略一个信号时,信号会被传递出去但进程会将信号丢弃。

3、信号阻塞系统调用,它们的都起到阻塞的作用,它们不是协作使用的。

[cpp] view plaincopyprint?
  1. #include <signal.h>
  2. int sigprocmask(ubt how,const sigset_t*set,sigset_t *oldset);
  3. 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示例(演示添加信号掩码):

[cpp] view plaincopyprint?
  1. #include <stdio.h>
  2. #include <signal.h>
  3. void checkset();
  4. void main()
  5. {
  6. sigset_tblockset;
  7. sigemptyset(&blockset);
  8. sigaddset(&blockset,SIGINT);
  9. sigaddset(&blockset,SIGTSTP);
  10. checkset();
  11. sigprocmask(SIG_SETMASK,&blockset,NULL);
  12. checkset();
  13. sigaddset(&blockset,SIGTERM);
  14. sigprocmask(SIG_BLOCK,&blockset,NULL);
  15. checkset();
  16. sigdelset(&blockset,SIGTERM);
  17. sigprocmask(SIG_UNBLOCK,&blockset,NULL);
  18. checkset();
  19. }
  20. void checkset()
  21. {
  22. sigset_tset set;
  23. printf("checksetstart:\n");
  24. if(sigprocmask(0,NULL,&set)<0)
  25. {
  26. printf("checksetsigprocmask error!!\n");
  27. exit(0);
  28. }
  29. if(sigismember(&set,SIGINT))
  30. printf("sigint\n");
  31. if(sigismember(&set,SIGTSTP))
  32. printf("sigtstp\n");
  33. if(sigismember(&set,SIGTERM))
  34. printf("sigterm\n");
  35. printf("checksetend\n");
  36. }

sigprocmask示例(演示添某部分代码不被信号打搅):

[cpp] view plaincopyprint?
  1. #include <stdio.h>
  2. #include <signal.h>
  3. void checkset();
  4. void func();
  5. void main()
  6. {
  7. sigset_tblockset,oldblockset,pendmask;
  8. printf("pid:%ld\n",(long)getpid());
  9. signal(SIGINT,func); //信号量捕捉函数,捕捉到SIGINT,跳转到函数指针func处执行
  10. sigemptyset(&blockset); //初始化信号量集
  11. sigaddset(&blockset,SIGTSTP); //将SIGTSTP添加到信号量集中
  12. sigaddset(&blockset,SIGINT);//将SIGINT添加到信号量集中
  13. sigprocmask(SIG_SETMASK,&blockset,&oldblockset); //将blockset中的SIGINT,SIGTSTP阻塞掉,并保存当前信号屏蔽字
  14. /*执行以下程序时,不会被信号打搅*/
  15. checkset();
  16. sleep(5);
  17. sigpending(&pendmask); //检查信号是悬而未决的
  18. if(sigismember(&pendmask,SIGINT)) //SIGINT是悬而未决的。所谓悬而未决,是指SIGQUIT被阻塞还没有被处理
  19. printf("SIGINTpending\n");
  20. /*免打搅结束*/
  21. sigprocmask(SIG_SETMASK,&oldblockset,NULL); //恢复被屏蔽的信号SIGINT SIGTSTP
  22. printf("SIGINTunblocked\n");
  23. sleep(6);
  24. }
  25. void checkset()
  26. {
  27. sigset_tset;
  28. printf("checksetstart:\n");
  29. if(sigprocmask(0,NULL,&set)<0)
  30. {
  31. printf("checksetsigprocmask error!!\n");
  32. exit(0);
  33. }
  34. if(sigismember(&set,SIGINT))
  35. printf("sigint\n");
  36. if(sigismember(&set,SIGTSTP))
  37. printf("sigtstp\n");
  38. if(sigismember(&set,SIGTERM))
  39. printf("sigterm\n");
  40. printf("checksetend\n");
  41. }
  42. void func()
  43. {
  44. printf("hellofunc\n");
  45. }

sigprocmask 阻塞进程相关推荐

  1. Android AlertDialog对话框不能阻塞进程

    因为AlertDialog对话框不能阻塞当前进程,如果在对话框后,有继续运行的代码,或有切换界面的代码,对话框会一闪而过,不等用户选择. 正确的做法应该是: if (条件){ AlertDialog ...

  2. c#中while(true)死循环阻塞进程,应该怎么办

    我在用c#做一个读卡器,过程中需要点击button进行循环读卡,再点击另一个button停止,我一看到循环读卡就想到while(true)让他一直读,循环读卡的确可以实现,但是之后却无法跳出循环,导致 ...

  3. mysql 查阻塞_mysql检查阻塞进程

    前言:朋友咨询我说执行简单的update语句失效,症状如下: mysql> update order_info set province_id=15 ,city_id= 1667 where o ...

  4. 线程的挂起是错误的概念实际是线程的阻塞,挂起只针对进程,将进程挂起会将进程从内存空间交换到磁盘空间的过程

    线程的挂起是错误的概念实际是线程的阻塞 线程的主要状态有运行态,就绪态和阻塞态.挂起态对线程没有什么意义,这是由于此类状态是一个进程级的概念.特别地,如果一个进程被换出,由于它的所有线程都该进程的地址 ...

  5. 操作系统(二 )| 进程管理初探(前趋图、程序执行、进程的定义特征基本状态,进程的创建终止,阻塞唤醒,挂起激活)

    文章目录 前趋图和程序执行 前趋图 程序的顺序执行 程序的并发执行 进程的定义和特征 进程的基本状态 就绪状态 运行状态 阻塞状态 挂起状态 进程控制块(PCB) 作用: 块中信息: PCB的组织方式 ...

  6. 进程控制:进程的创建、终止、阻塞、唤醒和切换

    进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程.撤销已有进程.实现进程状态转换等功能.在操作系统中,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不 ...

  7. 模拟进程创建、终止、阻塞、唤醒原语_操作系统第二章--进程的描述与控制

    操作系统第二章--进程的描述与控制 前趋图和程序执行 前趋图 前趋图是一个有向无循环图DAG,用来描述进程之间执行的前后关系 初始结点:没有前趋的结点 终止结点:没有后继的结点 重量:表示该结点所含有 ...

  8. 用户态程序阻塞原因_进程阻塞 操作系统某种情况进行进程的阻塞和唤醒操作...

    进程阻塞 1)请求系统服务.例如打印服务,进程在提出打印请求后,系统创建打印服务进程为该进程服务,而提出打印请求可能被阻塞起来等待打印的完成. 2)启动某种操作.例如,进程发出启动I/O或启动打印机的 ...

  9. 模拟进程创建、终止、阻塞、唤醒原语_轻松搞定进程原理

    进程简介 并发和并行 并发:在一个时间段中多个程序都启动运行在用一个处理机中 并行:两个进程分别由不同的CPU管理执行,两个进程不抢占CPU的资源,且可以同时运行,叫做并行 区别在于是否同时 多进程的 ...

最新文章

  1. Mysql新安装服务启动失败
  2. 无锡朗贤获B+轮融资,辰韬资本、兴韬投资领投
  3. 16 BasicHashTable基本哈希表类(三)——Live555源码阅读(一)基本组件类
  4. 云计算机教室安装学生软件,新东方云教室1.6版本
  5. MFC SendMessage()函数传递字符串
  6. Istio 1.7——进击的追风少年
  7. sohu读博——周忆清
  8. Django - 路由系统
  9. android 实现论坛界面,android界面开发之主流UI布局范例
  10. Linux:JDK配置
  11. 指针 是否相同_【变电小课堂】MF47指针式万用表操作指南
  12. 2018年湘潭大学程序设计竞赛 E 吃货
  13. Win10更新后桌面右键反应慢的问题
  14. 下一代游戏主机,8GB内存怎么够
  15. 如何用二分查找法查找有序数组
  16. 尼康D500套机相机黑屏是怎么回事
  17. unity开发抽奖系统
  18. 使用node连接MongoDB的工具安装及配置
  19. VUE项目学习(一):搭建VUE前端项目
  20. 危险化学品事故爬虫解析

热门文章

  1. vs2010编写的net3.5用vs2008打开
  2. aix查看lv_Aix 添加VG,LV并挂载使用
  3. Transaction rolled back because it has been marked as rollback-only 异常处理
  4. 无为职业学校计算机班,致盐亭职中2000级计算机三班全体同学的一封信
  5. 【C++深度剖析教程13】函数对象的分析
  6. 2019hdu多校1
  7. ltp makefile 解析
  8. iOS录音后播放声音变小的解决方法
  9. spring初始化bean时执行某些方法完成特定的初始化操作
  10. mac安装需要的骚操作