这两天看了apue有关进程信号的部分,觉得未决状态这个词很是不一般,呵呵。一开始当我看到这个词,我不理解,什么意思呢,读了好几遍。不知道是书里面讲的晦涩难懂,还是脑子越来越不行了,就是没有搞明白。后来看到后面的例子,然后再回想一下,终于清楚了!下面记录一下吧。

定义:信号产生和传递之间的时间间隔内,称此信号是未决的;

简单的说就是:一个已经产生的信号,但是还没有传递给任何进程,此时该信号的状态就称为未决状态。

未决状态信号的产生主要是因为进程对此信号的阻塞。例如为进程产生一个选择为阻塞的信号,而且对该信号的动作是系统默认动作或捕捉该信号,则为该进程将此信号保持为未决状态,直到该进程对此信号解除了阻塞或者对此信号的动作改为忽略。

我们知道,进程的信号屏蔽字规定了要阻塞传送到该进程的信号集。当产生了一个该进程已阻塞的信号,系统会为该进程生成一个信号集(其实该信号集是一直存在的,不是产生阻塞信号时才生成的),并将该阻塞的信号保存在此信号集中即将此信号集对应的信号置为未决状态。可以通过调用sigpending()来返回该信号集。

下面看一个apue上的例子:

  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <unistd.h>
  4. //信号处理函数
  5. static void sig_quit(int sigo)
  6. {
  7. printf("caught SIGQUIT...\n");
  8. //将SIGQUIT信号的处理方式恢复成系统默认的处理动作
  9. if(signal(SIGQUIT, SIG_DFL) == SIG_ERR)
  10. printf("can't reset SIGQUIT");
  11. }
  12. int main()
  13. {
  14. sigset_t newmask, oldmask, pendmask;
  15. //定义对信号SIGQUIT的捕捉
  16. if(signal(SIGQUIT, sig_quit) == SIG_ERR)
  17. {
  18. printf("can't catch SIGQUIT...\n");
  19. return 0;
  20. }
  21. sigemptyset(&newmask);//清空信号集中所有要屏蔽的信号
  22. sigaddset(&newmask, SIGQUIT);//将信号集中SIGQUIT信号设置为屏蔽
  23. //保存进程旧的信号屏蔽字,并设置新的信号屏蔽字即使进程屏蔽SIGQUIT信号
  24. if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
  25. {
  26. printf("SIG_BLOCK error...\n");
  27. return 0;
  28. }
  29. sleep(5);
  30. //返回阻塞的未决状态信号集
  31. if(sigpending(&pendmask) < 0)
  32. {
  33. printf("sigpending error...\n");
  34. return 0;
  35. }
  36. //判断在sleep期间是否有未决状态信号SIGQUIT产生
  37. if(sigismember(&pendmask, SIGQUIT))
  38. printf("\nSIGQUIT pending\n");
  39. //恢复进程的信号屏蔽字
  40. if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
  41. {
  42. printf("SIG_SETMASK error...\n");
  43. return 0;
  44. }
  45. printf("SIGQUIT unblocked\n");
  46. sleep(5);
  47. return 0;
  48. }

执行上面的程序:

  1. $ ./program
  2. ^\                       \\按下ctrl+\
  3. SIGQUIT pending
  4. caught SIGQUIT...
  5. SIGQUIT unblocked
  6. ^\                        \\再次按下ctrl+\
  7. 退出

由上面程序的执行结果可以知道,当第一次sleep时,按下ctrl+\时产生SIGQUIT信号,由于进程对该信号已屏蔽,所以不会响应该信号,系统会把该信号保存起来,所以在调用sigpending()时,其中会有未决状态信号SIGQUIT。当对恢复进程的信号屏蔽字时,系统会把该未决信号发送给该进程,所以此时进程会调用信号处理函数输出:caught SIGQUIT。调用信号处理函数时,会终止进程的执行,当信号处理函数结束返回后,唤醒进程,最后输出:SIGQUIT unblocked。在最后sleep时,我又输入ctrl+\,因为上次捕捉到该信号时,已将此信号的处理方式设置成默认动作,所以这一次会直接退出。

Oct 4, 2012 21:31 @library

原文:http://blog.csdn.net/anonymalias/article/details/8040155

进程信号的未决状态(pending status)的更多相关文章

  1. APUE学习笔记5——信号、信号集和进程信号屏蔽字

    1 信号传递过程 当引发信号的事件发生时(如软硬件异常.软件定时.终端产生信号或调用kill函数等等),会产生信号,内核会发送给目标进程. 在信号产生到信号传递给目标进程之间的时间间隔内,称该信号为未 ...

  2. UNIX环境编程学习笔记(24)——信号处理进阶学习之信号集和进程信号屏蔽字

    lienhua342014-11-03 1 信号传递过程 信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程.从信号产生到传递给目标进程的流程图如图 1 所示, 图 1: 信 ...

  3. 进程-信号相关 函数-(转自wblyuyang)

    Linux 中的进程: 程序时一个预定义的指令序列,用来完成一个特定的任务. C 编译器可以把每个源文件翻译成一个目标文件,链接器将所有的目标文件与一些必要的库链接在一起,产生一个可执行文件.当程序被 ...

  4. PHP 中的多进程使用,进程通信、进程信号等详解

    多进程环境要求 Linux 系统 php-cli 模式 pcntl 扩展 或 swoole 扩展 pcntl 扩展 <?php $str = "hello world!" . ...

  5. linux进程的几种状态

    Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态. Linux进程状态:R (TASK_RUNNING),可执行状态. 只有在该状 ...

  6. Linux 两组信号对比(关闭和停止进程信号)

    之前看信号的时候,没有太注意不同信号的对比.今天再次看到的时候,突然感觉对一些信号,非常相似,乃至非常容易混淆.今天周末就抽空总结一下. 一.关闭进程信号 常见的4中关闭进程信号是SIGKILL,SI ...

  7. 【C】——sigprocmask 阻塞进程信号

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

  8. linux进程的几个状态

    [linux进程的几个状态] 1. Linux进程状态:R (TASK_RUNNING),可执行状态&运行状态(在run_queue队列里的状态) 2. Linux进程状态:S (TASK_I ...

  9. Linux中进程的几种状态

    linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态. Linux进程状态:R (TASK_RUNNING),可执行状态. 只有在该状 ...

随机推荐

  1. 解决List遍历删除元素提示ConcurrentModificationException

    JDK1.8提供新的API  ===>  removeIf public static void main(String[] args) { List<String> list = ...

  2. 关于PHP导出数据超时的优化

    一般情况下,导出超时可能都是以下三种情况: 一.sql语句复杂,查询时间过长: 二.处理查询后数据逻辑冗余: 三.数据量过大导致响应超时. 接下来分别给出这三种情况的优化建议. 一.sql语句复杂,查 ...

  3. CRM系统对企业管理的作用有多大?

    随着市场经济的发展,对任何行业的企业来说,客户都是非常重要的一个部分.CRM系统帮助企业做到以客户为中心,它可以根据客户的具体要求进行跟进和反馈,在很大程度上提高公司的客户服务水平和客户满意度,进而提 ...

  4. 调整/home和/root空间容量

    转载请注明出处:http://www.cnblogs.com/gaojiang/p/6767043.html 1.查看磁盘情况:df -h 2.卸载/homeumount /home umount / ...

  5. Java初级面试题整理

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员. 我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验. 1. Java语言有哪些特点 ...

  6. Python单元测试框架unittest之生成测试报告(HTMLTestRunner)

    前言 批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的. unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLT ...

  7. python使用笔记16--操作redis

    操作redis应先引入第三方模块 执行以下命令 pip install redis 1.redis常用方法 1 import redis 2 #decode_responses=True将bytes转 ...

  8. ASP.NET保存图片到sql2008

    //将图片转行为二进制的方式,存储到数据库 string name = FileUpload1.PostedFile.FileName; string type = name.Substring(na ...

  9. 【Python从入门到精通】(十一)Python的函数的方方面面【收藏下来保证有用!!!】

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本文主要介绍Python的函数,函数的定义,使用,可变参数等等都有详细介绍. 干货满满,建议收藏,需要用到时常看看. 小伙伴们如有问题及需要,欢迎 ...

  10. 两台Linux系统之间传输文件的几种方法

    两台Linux系统之间传输文件的几种方法:参考https://www.cnblogs.com/bignode/articles/9241333.html