这两天看了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. 如何在微信小程序的模板渲染中使用JS?

    在微信小程序中使用模板渲染时,可能需要用JS对其进行处理. <view class="price text-red text-lg"> <!-- 价格保留两位小数 ...

  2. 企业管理CRM不只是客户录入系统

    企业在举办营销活动或者展会之后,将会收集到大量的客户信息,将这些信息有效地整理.完善.储存也是一个不小的工程.如果您的企业经常面遇到这样的情况,不妨使用Zoho CRM系统来帮您完成.但是,Zoho ...

  3. MIT6.828 Preemptive Multitasking(上)

    Lab4 Preemptive Multitasking(上) PartA : 多处理器支持和协作多任务 在实验的这部分中,我们首先拓展jos使其运行在多处理器系统上,然后实现jos内核一些系统功能调 ...

  4. RabbitMQ重试机制

    消费端在处理消息过程中可能会报错,此时该如何重新处理消息呢?解决方案有以下两种. 在redis或者数据库中记录重试次数,达到最大重试次数以后消息进入死信队列或者其他队列,再单独针对这些消息进行处理: ...

  5. 修改MySQL时区

    说明: 1.Windows版本暂无发现问题 2.CentOS-Docker版本需要修改时区 通过sql命令临时修改 mysql> set global time_zone = '+8:00'; ...

  6. 暑假自学java第十一天

    1,使用java.util.Arrays类处理数组 (1 ) public static void sort(数值类型 [ ] a):对指定的数值型数组按数字升序进行排序.在数组排序中设计一个简单的冒 ...

  7. 「CF1438D」 Powerful Ksenia

    「CF1438D」 Powerful Ksenia 题目大意 给定 \(n\) 个正整数,你可以任选三个数 \(a_i,a_j,a_k\),使这三个数都变为 \(a_i\oplus a_j\oplus ...

  8. Automation Framework Design 自动化框架设计思想

    从2007年到2017年,十年内自动化测试工具层出不穷,各种工具在运用一段时间之后,各个公司都会有测试架构师对于目前的自动化测试工具进行框架定制设计. 从惠普2007年GDCC推出的的WebDrivi ...

  9. C++之vector容器

    一.STL的基本概念 STL(Standard Template Library)标准模板库大体上分为六大组件,分别为容器,算法,迭代器,仿函数,适配器和空间配置器,其中最重要的是容器,算法和迭代器, ...

  10. CSAPP:bomblab

    BOMBLAB实验总结 CSAPP实验BOMB,很头疼,看不懂,勉强做完了. 答案是这样的: Border relations with Canada have never been better. ...