ZT sigprocmask,sigpending函数
sigprocmask,sigpending函数
【sigprocmask系统调用】
功能描述:设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞)。
用法:
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
参数:
how:用于指定信号修改的方式,可能选择有三种
SIG_BLOCK //加入信号到进程屏蔽。
SIG_UNBLOCK //从进程屏蔽里将信号删除。
SIG_SETMASK //将set的值设定为新的进程屏蔽。
set:为指向信号集的指针,在此专指新设的信号集,如果仅想读取现在的屏蔽值,可将其置为NULL。
oldset:也是指向信号集的指针,在此存放原来的信号集。
返回说明:
成功执行时,返回0。失败返回-1,errno被设为EINVAL。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
//#include <>
static void sig_quit(int signo)
{
printf("caught SIGQUIT/n");
signal(SIGQUIT, SIG_DFL);//将SIGQUIT的动作设为缺省值
}
int main()
{
sigset_t newmask;
sigset_t oldmask;
sigset_t pendmask;
signal(SIGQUIT, sig_quit);//信号量捕捉函数,捕捉到SIGQUIT,跳转到函数指针sig_quit处执行
sigemptyset(&newmask);//初始化信号量集
sigaddset(&newmask, SIGQUIT);//将SIGQUIT添加到信号量集中
sigprocmask(SIG_BLOCK, &newmask, &oldmask);//将newmask中的SIGQUIT阻塞掉,并保存当前信号屏蔽字到Oldmask
sleep (5);//休眠5秒钟,这里做说明:在5s休眠期间,任何SIGQUIT信号都会被阻塞,如果在5s内收到任何键盘的quit信号,则此时会把这些信息存在内核的队列中,等待5s结束后,可能要处理此信号。
sigpending(&pendmask);//检查信号是悬而未决的,
if (sigismember(&pendmask, SIGQUIT))//SIGQUIT是悬而未决的。所谓悬而未决,是指SIGQUIT被阻塞还没有被处理
{
printf("/nSIGQUIT pending/n");
}
sigprocmask(SIG_SETMASK, &oldmask, NULL);//恢复被屏蔽的信号SIGQUIT
/**开始处理信号,调用信号处理函数*/
printf("SIGQUIT unblocked/n");
sleep(5);//再次休眠5秒钟
return (0);
}
以上示例是Linux redhat,
执行结果是
$./a.out
^/ /**此处使用"CTRL+/" 产生SIGQUIT */
SIGQUIT pending
caught SIGQUIT 在sigprocmask返回之前处理阻塞信号SIGQUIT,输出它
SIGQUIT unblocked
^/Quit (coredump)//因为已经被设置为缺省值,所以再次产生SIGQUIT 信号,直接退出
【sigpending系统调用】
#include<signal.h>
int sigpending(sigset_t *set);
sigpending函数返回信号集,其中的各个信号对于调用进程是堵塞的而不能递送,因而也一定是未决的。该信号集通过set参数返回。
更多
- 上一篇:关于SIGPIPE信号
- 下一篇:多线程server应注意问题
ZT sigprocmask,sigpending函数的更多相关文章
- linux c编程:信号(三) sigprocmask和sigpending函数
信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程.从信号产生到传递给目标进程的流程图如下图所示: 进程可以阻塞信号的传递.当信号源为目标进程产生了一个信号之后,内核会执行依 ...
- sigprocmask , sigpending 和 sigsuspend函数
转自 http://blog.csdn.net/elbort/article/details/7594772 sigprocmask函数:功能描述:设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞). ...
- 信号之sigpending函数
sigpending函数返回信号集,其中的各个信号对于调用进程是阻塞的而不能递送,因而也一定是当前未决的.该信号集通过set参数返回.(这些信号是已经产生的信号,但因为信号屏蔽字中对其设置了屏蔽位,从 ...
- sigprocmask, sigpending, sigsuspend的用法
sigset_t set sigemptyset(&set) :清空阻塞信号集合变量 sigfillset(&set) :添加所有的信号到阻塞集合变量里 sigaddset(& ...
- ZT 复杂的函数指针例子分析 2008
复杂的函数指针例子分析 2008-01-26 11:38:22 分类: 一个最简单的函数指针定义如下: Void (*funcPtr) (); //funcptr是一个函数指针,它指向的函数没有参数 ...
- ZT 线程处理函数pthread_cleanup_push / pthread_cleanup_pop
http://bbs.csdn.net/topics/390688105 2)创建了线程,但是线程退出时没有线程调用pthread_join() 线程资源没有回收,如果持续创建线程,到一定数量后将不能 ...
- Linux进程间通信(二):信号集函数 sigemptyset()、sigprocmask()、sigpending()、sigsuspend()
我们已经知道,我们可以通过信号来终止进程,也可以通过信号来在进程间进行通信,程序也可以通过指定信号的关联处理函数来改变信号的默认处理方式,也可以屏蔽某些信号,使其不能传递给进程.那么我们应该如何设定我 ...
- signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数
信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...
- 【C】——利用sigsuspend函数等待信号阻塞进程
#include<signal.h> int sigsuspend(const sigset_t *sigmask); 返回值:-,并将errno设置为EINTR 将进程的信号屏蔽字设置为 ...
随机推荐
- HTTPS和SSL详解
这是转载别人的(转:崔永秀) 把这几天学习到的关于ssl和https协议的内容在这里分享一下,适合一些像我一样的网络协议初学者. ssl协议的起源和历史我就不再多说了,就是那个Netscape 网景公 ...
- Cloudera Manager安装之Cloudera Manager安装前准备(Ubuntu14.04)(一)
其实,基本思路跟如下差不多,我就不多详细说了,贴出主要图. 博主,我是直接借鉴下面这位博主,来进行安装的!(灰常感谢他们!) 在线和离线安装Cloudera CDH 5.6.0 Cloudera M ...
- eclipse中springsource-tool-suite(sts)插件安装教程
插件的下载参照:http://www.cnblogs.com/jepson6669/p/8540157.html 用过的eclipse不能安装成功,需要重新解压新的才能安装成功,不知道为什么? 解压上 ...
- div+css 让一个小div在另一个大div里面 垂直居中
方法1: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 .parent { width:800px; height:500px; ...
- Java入门系列-26-JDBC
认识 JDBC JDBC (Java DataBase Connectivity) 是 Java 数据库连接技术的简称,用于连接常用数据库. Sun 公司提供了 JDBC API ,供程序员调用接口和 ...
- Change - Why we need coding standards
Change - Why we need coding standards I have the idea of coding standards when I have to review my t ...
- C++(笔)001.
1.编程范式 编程范式是指计算机编程的基本风格,C++可容纳多种程度范式,如面向对象编程.泛型编程及传统的过程式编程. 2.与C相比较 C++在C语言的基础上新加的特性如下: a.类和对象.继承 b. ...
- IDEA启动Jetty报404
在别的电脑上是OK的,到本机就不行了,很可能是Working路径的问题. 设置这里的路径即可:(你的web模块路径)
- java 并发(五)---AbstractQueuedSynchronizer(5)
问题 : ArrayBlockQueue 和 LinkedBlockQueue 的区别 两者的实现又是怎么样的 应用场景 BlockingQueue 概述 blockingQueue 是个接口,从名字 ...
- hdu 3091 Necklace 状态压缩dp *******
Necklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327680/327680 K (Java/Others)Total ...