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. NYOJ-104最大和

    我看了好多博客,都是拿一维的做基础,一维的比较简单,所以要把二维的化成一维的,一维的题目大意:给了一个序列,求那个子序列的和最大,这时候就可以用dp来做,首先dp[i]表示第i个数能构成的最大子序列和 ...

  2. 帧动画 AnimationDrawable

    Drawable Animation(Frame Animation):帧动画,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果. 首先,在res/drawable中定义动画 < ...

  3. 图片跟着鼠标动js

    <!DOCTYPE html><html><head> <title>duisgf</title> <meta charset=&qu ...

  4. Eclipse利用代理快速安装插件

    在eclipse启动时增加以下参数: eclipse.exe -vmargs -DproxySet=true -DproxyHost=aProxyAddress -DproxyPort=aProxyP ...

  5. axure RP Pro7.0加载日历控件的步骤

  6. Namespace declaration statement has to be the very first

    Namespace declaration statement has to be the very first statement in the script 我新建了一个Homea模块,并把Hom ...

  7. SQL数据库中把一个表中的数据复制到另一个表中

    1.如果是整个表复制表达如下: insert into table1 select  * from table2 2.如果是有选择性的复制数据表达如下: insert into table1(colu ...

  8. 启用DHCP中继代理,实现跨子网服务 - Win 2003 Server

    伴随着局域网规模的逐步扩大,一个网络常常会被划分成多个不同的子网,以便根据不同子网的工作要求来实现个性化的管理要求.考虑到规模较大的局域网一般会使用DHCP服务器来为各个工作站分配IP地址,不过一旦局 ...

  9. 第一次启动MySQL时报错

    [root@localhost~]#/usr/local/webserver/mysql/bin/mysql_install_db --basedir=/usr/local/webserver/mys ...

  10. Qt5如何设置静态编译,解决生成的可执行文件打开出错问题

    将https://yunpan.cn/cqGGURjmG2fEY  访问密码 8de5  中的压缩包Qt5-MSVC-Static-master.zip 解压到你的qt安装目录,一般就是C:\Qt下, ...