1.信号集基本操作

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

2.sigpromask函数

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

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

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

3.sigpending函数

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

实践:

  1. #include <stdio.h>
  2. #include <signal.h>
  3.  
  4. static void sigquit(int signo){
  5. printf("caught sigquit.\n");
  6. if(signal(SIGQUIT, SIG_DFL) == SIG_ERR){
  7. perror("signal");
  8. }
  9. }
  10.  
  11. int main(void){
  12. sigset_t newmask,oldmask,pendmask;
  13. if(signal(SIGQUIT,sigquit) == SIG_ERR){
  14. perror("signal");
  15. return -1;
  16. }
  17.  
  18. sigemptyset(&newmask);
  19. sigaddset(&newmask, SIGQUIT);
  20. if(sigprocmask(SIG_BLOCK,&newmask,&oldmask) < 0){
  21. perror("sigpromask");
  22. return -1;
  23. }
  24.  
  25. sleep(5);
  26.  
  27. if(sigpending(&pendmask) < 0){
  28. perror("sigpending");
  29. return -1;
  30. }
  31. if(sigismember(&pendmask,SIGQUIT)){
  32. printf("SIGQUIT pending\n");
  33. }
  34.  
  35. if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0){
  36. perror("sigpromask");
  37. return -1;
  38. }
  39.  
  40. sleep(5);
  41. return 0;
  42. }

运行结果:

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. IO-文件 File 复制 读写 总结

    一定要注意: 传入的参数,应该是包含文件名的完整路径名,不能把一个文件复制到[文件夹]中,因为[文件夹]本身是不能有输入输出流的,只能复制到一个[文件]中,否则会报异常. 以字节流读写的三种方式 pu ...

  2. VS2015编译器问题简单记录

    问题:VS2015community 无法查找或打开 pdb 文件 解决办法: 1.点击工具->选项, 在选项窗口中展开左侧菜单: 2.展开调试->常规,然后在右边的窗格中勾选“启用服务器 ...

  3. 高放的python学习笔记之基本语法

    python与c++的不同之处 python的语句块不是用{}括起来的而是冒号后面跟一些与比当前语句多一的tab缩进的语句. 1.定义变量 python的变量类型不需要人为指出,会根据赋值的类型决定此 ...

  4. C/C++默认浮点型

    代码: #include <iostream> #include <cstdio> using namespace std; void test(int a){ cout< ...

  5. libusb简介

    概述 libusb是一个C库,它提供了通用的访问USB设备. 它的目的是供开发人员使用方便的生产与USB通信硬件的应用程序. 可移植的: 使用一个跨平台API,它提供了访问USB设备在Linux上,O ...

  6. Linux(CentOS)搭建SVN服务器全攻略

    虽然在windows上搭建SVN很简单,但是效能却不高,这当然是和linux相比了.然而在linux上搭建SVN却非常繁琐,所以今天这篇文章就来一步一步教您如何在Centos上搭建SVN 安装#yum ...

  7. Java在ACM中的使用

    1.基本框架   import java.oi.*;   import java.util.*   public class Main   {   public static void main(St ...

  8. 如何使用service命令来管理nginx

    如何使用service命令来管理nginx??? 如: service nginx start service nginx restart service nginx stop service ngi ...

  9. Filter及FilterChain的使用详解

    原文地址:http://blog.csdn.net/zhaozheng7758/article/details/6105749 一.Filter的介绍及使用 什么是过滤器? 与Servlet相似,过滤 ...

  10. asp.net core VS goang web[修正篇]

    先前写过一篇文章:http://www.cnblogs.com/gengzhe/p/5557789.html,也是asp.net core和golang web的对比,热心的园友提出了几点问题,如下: ...