进程信号的未决状态(pending status)
这两天看了apue有关进程信号的部分,觉得未决状态这个词很是不一般,呵呵。一开始当我看到这个词,我不理解,什么意思呢,读了好几遍。不知道是书里面讲的晦涩难懂,还是脑子越来越不行了,就是没有搞明白。后来看到后面的例子,然后再回想一下,终于清楚了!下面记录一下吧。
定义:信号产生和传递之间的时间间隔内,称此信号是未决的;
简单的说就是:一个已经产生的信号,但是还没有传递给任何进程,此时该信号的状态就称为未决状态。
未决状态信号的产生主要是因为进程对此信号的阻塞。例如为进程产生一个选择为阻塞的信号,而且对该信号的动作是系统默认动作或捕捉该信号,则为该进程将此信号保持为未决状态,直到该进程对此信号解除了阻塞或者对此信号的动作改为忽略。
我们知道,进程的信号屏蔽字规定了要阻塞传送到该进程的信号集。当产生了一个该进程已阻塞的信号,系统会为该进程生成一个信号集(其实该信号集是一直存在的,不是产生阻塞信号时才生成的),并将该阻塞的信号保存在此信号集中即将此信号集对应的信号置为未决状态。可以通过调用sigpending()来返回该信号集。
下面看一个apue上的例子:
- #include <stdio.h>
- #include <signal.h>
- #include <unistd.h>
- //信号处理函数
- static void sig_quit(int sigo)
- {
- printf("caught SIGQUIT...\n");
- //将SIGQUIT信号的处理方式恢复成系统默认的处理动作
- if(signal(SIGQUIT, SIG_DFL) == SIG_ERR)
- printf("can't reset SIGQUIT");
- }
- int main()
- {
- sigset_t newmask, oldmask, pendmask;
- //定义对信号SIGQUIT的捕捉
- if(signal(SIGQUIT, sig_quit) == SIG_ERR)
- {
- printf("can't catch SIGQUIT...\n");
- return 0;
- }
- sigemptyset(&newmask);//清空信号集中所有要屏蔽的信号
- sigaddset(&newmask, SIGQUIT);//将信号集中SIGQUIT信号设置为屏蔽
- //保存进程旧的信号屏蔽字,并设置新的信号屏蔽字即使进程屏蔽SIGQUIT信号
- if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
- {
- printf("SIG_BLOCK error...\n");
- return 0;
- }
- sleep(5);
- //返回阻塞的未决状态信号集
- if(sigpending(&pendmask) < 0)
- {
- printf("sigpending error...\n");
- return 0;
- }
- //判断在sleep期间是否有未决状态信号SIGQUIT产生
- if(sigismember(&pendmask, SIGQUIT))
- printf("\nSIGQUIT pending\n");
- //恢复进程的信号屏蔽字
- if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
- {
- printf("SIG_SETMASK error...\n");
- return 0;
- }
- printf("SIGQUIT unblocked\n");
- sleep(5);
- return 0;
- }
执行上面的程序:
- $ ./program
- ^\ \\按下ctrl+\
- SIGQUIT pending
- caught SIGQUIT...
- SIGQUIT unblocked
- ^\ \\再次按下ctrl+\
- 退出
由上面程序的执行结果可以知道,当第一次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)的更多相关文章
- APUE学习笔记5——信号、信号集和进程信号屏蔽字
1 信号传递过程 当引发信号的事件发生时(如软硬件异常.软件定时.终端产生信号或调用kill函数等等),会产生信号,内核会发送给目标进程. 在信号产生到信号传递给目标进程之间的时间间隔内,称该信号为未 ...
- UNIX环境编程学习笔记(24)——信号处理进阶学习之信号集和进程信号屏蔽字
lienhua342014-11-03 1 信号传递过程 信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程.从信号产生到传递给目标进程的流程图如图 1 所示, 图 1: 信 ...
- 进程-信号相关 函数-(转自wblyuyang)
Linux 中的进程: 程序时一个预定义的指令序列,用来完成一个特定的任务. C 编译器可以把每个源文件翻译成一个目标文件,链接器将所有的目标文件与一些必要的库链接在一起,产生一个可执行文件.当程序被 ...
- PHP 中的多进程使用,进程通信、进程信号等详解
多进程环境要求 Linux 系统 php-cli 模式 pcntl 扩展 或 swoole 扩展 pcntl 扩展 <?php $str = "hello world!" . ...
- linux进程的几种状态
Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态. Linux进程状态:R (TASK_RUNNING),可执行状态. 只有在该状 ...
- Linux 两组信号对比(关闭和停止进程信号)
之前看信号的时候,没有太注意不同信号的对比.今天再次看到的时候,突然感觉对一些信号,非常相似,乃至非常容易混淆.今天周末就抽空总结一下. 一.关闭进程信号 常见的4中关闭进程信号是SIGKILL,SI ...
- 【C】——sigprocmask 阻塞进程信号
1.有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数.这种情况是通过阻塞信号实现的. 2.信号阻塞和忽略信号的区别. 阻塞的概念和忽略 ...
- linux进程的几个状态
[linux进程的几个状态] 1. Linux进程状态:R (TASK_RUNNING),可执行状态&运行状态(在run_queue队列里的状态) 2. Linux进程状态:S (TASK_I ...
- Linux中进程的几种状态
linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态. Linux进程状态:R (TASK_RUNNING),可执行状态. 只有在该状 ...
随机推荐
- Docker:部署PXC8.0集群时,启动容器报错New joining cluster node didn‘t find all needed SSL artifacts
使用docker部署mysql PXC集群8.0版本,启动第二个节点的时候遇到报错,New joining cluster node didn't find all needed SSL artifa ...
- [心得体会]jvm
1. jvm基本架构图 橙色: 线程共享的, gc主要的场所 灰色: 线程不共享 2. 类加载器 启动类加载器(c++加载器) 扩展类加载器(java应用程序加载器) 应用加载器(加载classpat ...
- PHP严格类型检查模式
前言 PHP默认情况下是弱类型校验模式,在php7下declare新增了strict_types指令,通过设置strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句 ...
- NAT444技术简介
嘛,最近老师布置了一道题目与NAT444技术相关,遂收集一波相关资料. 首先来一波名词解释: ICP:网络内容服务商(Internet Content Provider) BRAS:宽带远程接入服务( ...
- M1卡分类
M1卡复制前文说到,每一张M1卡的0扇区0块都是出厂时厂商赋予的绝对地址块,我们无法在M1卡内直接修改它. 说到这不得不提一下M1卡的复制子卡--UID卡,FUID卡,CUID卡. UID卡UID卡是 ...
- 在不受支持的 Mac 上安装 macOS Monterey 12
请注意,当前为 Beta 版,后续会及时更新. 请访问原文链接:https://sysin.org/blog/install-macos-12-on-unsupported-mac/,查看最新版.原创 ...
- 「干货」面试官问我如何快速搜索10万个矩形?——我说RBush
「干货」面试官问我如何快速搜索10万个矩形?--我说RBUSH 前言 亲爱的coder们,我又来了,一个喜欢图形的程序员,前几篇文章一直都在教大家怎么画地图.画折线图.画烟花,难道图形就是这样嘛,当 ...
- POJ1704 Georgia and Bob 题解
阶梯博弈的变形.不知道的话还是一道挺神的题. 将所有的棋子两两绑在一起,对于奇数个棋子的情况,将其与起点看作一组.于是便可以将一组棋子的中间格子数看作一推石子.对靠右棋子的操作是取石子,而对左棋子的操 ...
- 程序向informix数据库插入text类型的中文乱码问题
部署应用的Linux服务器的编码格式为utf-8.但是数据库的编码格式为Gbk.所以导致的乱码.但是其他类型的数据中文并不乱码. 通过图片中修改编码格式,可以解决,导致的后果就是tomcat的日志输出 ...
- tomcat默认端口
关于tomcat默认端口为8080: 网页浏览器的默认端口为80.