1.信号集基本操作

我们需要有一个能表示多个信号--信号集(signal set)的数据类型。POSIX.1定义了数据类型sigset_t以包含一个信号
集,并且定义了一下五个处理信号处理信号集函数。
#include <signal.h>
int sigemptyset(sigset_t *set); //清除set中所有的信号
int sigfillset(sigset_t *set); //使set包含所有的信号
int sigaddset(sigset_t *set, int signo); //将signo加入到set中
int sigdelset(sigset_t *set, int signo); //将signo从set中删除
//四个函数的返回值:若成功则返回0,若出错则返回-1.
int sigismemeber(const sigset_t *set, int signo);
//返回值:若真则返回1,若假则返回0,出错则返回-1.

2.sigpromask函数

调用sigpromask函数可以检测或更改其信号屏蔽字,或在一个步骤中同时执行这两个步骤。
#include <signal.h>
int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);
//返回值:成功返回0,出错返回-1.

如果oset是非空指针,那么进程的当前信号屏蔽字通过oset返回。

如果set是一个非空指正,则参数how指示如何修改当前信号屏蔽字。
如果how为0,set为NULL,而oset不为空,则在oset中返回进程当前的信号集。
下图指示了how的可选用值。
sigprocmask是仅在单线程的进程定义的,为处理多线程的进程中的信号的屏蔽,提供了另外的函数。

3.sigpending函数

sigpending函数返回信号集,其中的各个信号对于调用进程是阻塞的而不能传递,该信号集通过set参数返回。
#include <signal.h>
int sigpending(sigset_t *set);
//若成功则返回0,出错则返回-1.

实践:

#include <stdio.h>
#include <signal.h> static void sigquit(int signo){
printf("caught sigquit.\n");
if(signal(SIGQUIT, SIG_DFL) == SIG_ERR){
perror("signal");
}
} int main(void){
sigset_t newmask,oldmask,pendmask;
if(signal(SIGQUIT,sigquit) == SIG_ERR){
perror("signal");
return -1;
} sigemptyset(&newmask);
sigaddset(&newmask, SIGQUIT);
if(sigprocmask(SIG_BLOCK,&newmask,&oldmask) < 0){
perror("sigpromask");
return -1;
} sleep(5); if(sigpending(&pendmask) < 0){
perror("sigpending");
return -1;
}
if(sigismember(&pendmask,SIGQUIT)){
printf("SIGQUIT pending\n");
} if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0){
perror("sigpromask");
return -1;
} sleep(5);
return 0;
}

运行结果:

yan@yan-vm:~/apue$ ./a.out
^\^\^\^\^\^\^\^\^\^\SIGQUIT pending

caught sigquit.

^\Quit (core dumped)

在程序第一次sleep时,产生了多个SIGQUIT消息,此时被pending,解除了mask后,只产生了一次action,也说明了在同一时刻
产生多次同一种信号,不会对信号排队。

《UNIX环境高级编程》笔记--信号集的更多相关文章

  1. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...

  2. UNIX环境高级编程--10. 信号

    第十章        信号    信号是软中断,提供了一种处理异步事件的方法.例如,终端用户键入终端键,会通过信号机制停止一个进程,或及早终止管道中的下一个程序.    每个信号都有一个名字,SIG开 ...

  3. Unix环境高级编程(十)信号续

    1.signal函数 Unix系统的信号机制最简单的接口是signal函数,函数原型如下: #include <signal.h> typedef void (*sighandler_t) ...

  4. UNIX环境高级编程笔记 目录

    每一章的重点会使用加粗字体 第一章:UNIX基础知识:UNIX体系结构:文件和目录:输入和输出:程序和进程:出错处理:信号:时间值:系统调用和库函数 第三章:文件I/O:文件描述符:文件操作函数:文件 ...

  5. UNIX环境高级编程——可靠信号与不可靠信号

    在早期的UNIX中信号是不可靠的,不可靠在这里指的是:信号可能丢失,一个信号发生了,但进程却可能一直不知道这一点. 现在Linux 在SIGRTMIN实时信号之前的都叫不可靠信号,这里的不可靠主要是不 ...

  6. Unix环境高级编程(九)信号

    信号时软中断,很多比较重要的应用程序都需要处理信号,信号提供了一种处理异步事件的方法.每个信号都一个名字,以SIG开头,在<signal.h>头文件中定义信号类型,都是正整数(信号编号). ...

  7. UNIX环境高级编程笔记之高级I/O

    本章说明了很多高级I/O功能: 非阻塞I/O——发一个I/O操作,不使其阻塞,记录锁,STREAMS机制 I/O多路转接——select和poll函数 readv和writev函数,以及存储映射I/O ...

  8. UNIX环境高级编程笔记之线程

    本章涉及到线程的一些基本知识点,讨论了现有的创建线程和销毁线程的POSIX.1原语,此外,重点介绍了线程同步问题,讨论了三种基本的同步机制:互斥量.读写锁.条件变量.

  9. UNIX环境高级编程笔记之进程控制

    本章重点介绍了进程控制的几个函数:fork.exec族._exit.wait和waitpid等,主要需要掌握的是父进程和子进程之间的运行机制,怎么处理进程的正常和异常终止.以及怎么让进程执行不同的程序 ...

  10. UNIX环境高级编程笔记之进程环境

    本章讲的都是一些非常基础的知识,目的是为了下一章讲进程控制做铺垫,所以,本章就不做过多的总结了,直接看图吧.

随机推荐

  1. FineUI初学手册

    女朋友鄙视我原创少... 1.下载 进入官方论坛:http://www.fineui.com/bbs/ 要用到下载源代码和空项目下载 http://fineui.codeplex.com/ http: ...

  2. ASP.NET-FineUI开发实践-6(二)

    1.上回说到修改以前的会出现好几个5: 这是因为新增时是只新增到最后一行,所以点击选好了就跑到最后一行了,而且行号不会累积,只加到初始化的行号. 其实js里是有插入的,例子里可以插入到第一行,新增是a ...

  3. java克隆总结

    对象clone,注意基本类型和指针类型.

  4. Nopcommerce商城添加【满XX减XX优惠券】功能

    公司的电商网站要做个优惠券的功能,nop框架,但我接触nop时间不多,最后还是为了功能而完成了.这中间肯定有很多小问题. Nopcommerce自带的促销功能感觉不是很好,首先优惠券功能放在购物车页面 ...

  5. (转)linux下导入、导出mysql数据库命令

    原文链接:http://www.xiaohuai.com/2902 一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径):1.导出数据和表结构:mysqldump -u用 ...

  6. Android开发手记(14) 使用MediaPlayer播放mp3

    1.获取MediaPlayer实例 (1)可以直接通过new或者create方式: 调用setDataSource和create的区别是,create时已经执行了MediaPlayer.prepare ...

  7. 用css3实现闪烁效果

    1. css3 @keyframes 参考 css3 @keyframes规则. 特别注意浏览器支持: Internet Explorer 10, Firefox, 和 Opera 支持 @keyfr ...

  8. C++拾遗(六)函数相关(1)

    返回值 C++规定返回值不能是 数组.但可以是其它任何类型(包括结构体和对象). 通常,函数将返回值复制到指定的CPU寄存器或内存单元中,然后调用函数调用该内存单元的值. 函数原型 参数列表中可以不包 ...

  9. 解决secureCRT数据库里没有找到防火墙 '无'问题,转自:http://jingyan.baidu.com/article/9989c74601274bf649ecfe74.html

    中文版的secureCRT由于汉化的问题(把null翻译成无了),导致每次打开都会有个防火墙的错误提示:数据库里没有找到防火墙 '无' 此会话将尝试不通过防火墙进行连接.出现这个错误的原因是在secu ...

  10. mysql服务启动

    1.C:\Program Files (x86)\MySQL\mysql-5.5.33-win32\bin>net stop mysqlMySQL 服务正在停止.MySQL 服务已成功停止. 2 ...