这两天看了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. LVS-NAT模式的实现

    一.架构如下: 二.安装过程 1.配置"互联网"服务器 1.1.修改服务器ip为192.168.10.101/24 [root@internet ~]# ip a 1: lo: & ...

  2. DRF之过滤排序分页异常处理

    一.过滤 对于列表数据要通过字段来进行过滤,就需要添加 django-filter 模块 使用方法: # 1.注册,在app中注册 settings.py INSTALLED_APPS = [ 'dj ...

  3. php操作redis集群哨兵模式

    前段时间项目里正好用到了redis的集群哨兵部署,因为此前并无了解过,所以一脸懵逼啊,查阅了几篇资料,特此综合总结一下,作为记录. 写在前沿:随着项目的扩张,对redis的依赖也越来越大,为了增强re ...

  4. 字符串中的第一个唯一字符 python

    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. s = "leetcode" 返回 0. s = "loveleetcode&qu ...

  5. ROS2学习之旅(13)——创建ROS2 功能包

    一个功能包可以被认为是ROS2代码的容器.如果希望能够管理代码或与他人共享代码,那么需要将其组织在一个包中.通过包,可以发布ROS2工作,并允许其他人轻松地构建和使用它. 在ROS2中,创建功能包使用 ...

  6. YAOI Round #1 题解

    前言 比赛网址:http://47.110.12.131:9016/contest/3 总体来说,这次比赛是有一定区分度的, \(\text{ACM}\) 赛制也挺有意思的. 题解 A. 云之彼端,约 ...

  7. PYTHON 读取ADB记录文件输入ACTIVITY

    import re lb=[] with open("daaa.txt",encoding="utf8") as f: data = f.readlines() ...

  8. 创建自己的RSA密钥来保护web.config 加密数据库连接字符串

    通过创建自己的RSA密钥来保护web.config1创建RSA密钥:C:\Windows\Microsoft.NET\Framework64\v4.0.30319>aspnet_regiis - ...

  9. LeetCode 895. Maximum Frequency Stack

    题目链接:https://leetcode.com/problems/maximum-frequency-stack/ 题意:实现一种数据结构FreqStack,FreqStack需要实现两个功能: ...

  10. 前端开发入门到进阶第四集【使用sublime安装jshint和cssLint】

    参考:https://blog.csdn.net/qq_27965129/article/details/52786224 使用sublime安装JSHint插件: 1,解决不能使用package c ...