设置信号集和信号屏蔽字
来源:互联网 发布:做淘宝怎么代销 编辑:程序博客网 时间:2024/04/29 23:07
信号屏蔽字是指一个进程中当前阻塞而不能够递送给该进程的信号集。
信号集则是一个能表示多个信号的集合的一种数据类型,为sigset_t。
与信号集设置相关的函数有如下几个:
#include <signal.h>/* * 下列四个函数成功返回0,出错返回-1 */int sigemptyset(sigset_t *set);int sigfillset(sigset_t *set);int sigaddset(sigset_t *set, int signo);int sigdelset(sigset_t *set, int signo);/* * 下面函数若真返回1,若假返回0,出错返回-1 */int sigismember(const sigset_t *set, int signo);
要注意的是,所有应用程序在使用信号集前,要对信号集调用sigemptyset或sigfillset一次。这是因为C编译器把未赋初值的外部和静态变量都初始化为0,而这是否与给定的信号集实现对应却并不清楚。
设置信号屏蔽字则要调用下面函数:
#include <signal.h>int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);
how取值有下列三个:
SIG_BLOCK :set中包含的是希望阻塞的附加信号
SIG_UNBLOCK:set中包含的是希望解除阻塞的信号
SIG_SETMASK:set中包含的是现有屏蔽字的代替值
若oset是非空指针,则返回进程的当前信号屏蔽字。
若set为空,则进程信号屏蔽字不变,how值无意义。
另外,注意一点,不可以阻塞SIGKILL和SIGSTOP信号。
要想处理关于信号屏蔽字的问题,还需要一个函数,就是sigpending,原型如下:
#include <signal.h>int sigpending(sigset_t *set);
此函数通过set返回当前正在阻塞的信号的信号集。
下面通过一个实例理解一下这几个函数的用法:
#include <signal.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>static void sig_quit(int);static void err_quit(const char *str){perror(str);exit(-1);}int main(void){sigset_t newmask, oldmask, pendmask;if (signal(SIGQUIT, sig_quit) == SIG_ERR)err_quit("can't catch SIGQUIT");sigemptyset(&newmask);sigaddset(&newmask, SIGQUIT);if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)err_quit("SIG_BLOCK error");sleep(5);if (sigpending(&pendmask) < 0)err_quit("sigpending error");if (sigismember(&pendmask, SIGQUIT))printf("\nSIGQUIT pending\n");if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)err_quit("SIG_SETMASK error");printf("SIGQUIT unblocked\n");sleep(5);exit(0);}static void sig_quit(int signo){printf("caught SIGQUIT\n");if (signal(SIGQUIT, SIG_DFL) == SIG_ERR)err_quit("can't reset SIGQUIT");}
在ubuntu12.04下运行结果如下
[unix]$ ./a.out
^\^\^\^\^\^\^\^\^\^\
SIGQUIT pending
caught SIGQUIT
SIGQUIT unblocked
^\退出 (核心已转储)
上面十个信号只有一个输出是因为SIGQUIT是不可靠信号,系统没有对其进行排队。
- 设置信号集和信号屏蔽字
- 信号集和信号屏蔽函数
- linux信号集与信号屏蔽字
- APUE学习笔记——信号、信号集和进程信号屏蔽字
- 信号集与屏蔽信号
- 信号集与屏蔽字
- 设置信号阻塞掩码,屏蔽特定信号
- 子进程屏蔽信号设置
- 信号屏蔽字
- 信号屏蔽字
- linux信号屏蔽字
- 信号屏蔽字
- 信号屏蔽字&信号未决字
- 屏蔽信号
- 信号屏蔽
- APUE学习笔记——10.11~10.13 信号集、信号屏蔽字、未决信号
- UNIX环境编程学习笔记(24)——信号处理进阶学习之信号集和进程信号屏蔽字
- Linux 信号和信号集
- iOS中读取照片库
- 深入浅出 Cocoa 多线程编程之 block 与 dispatch quene
- FTP上传文件
- OPENCV 随机数
- ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)
- 设置信号集和信号屏蔽字
- Service Locator Design Pattern
- Problems occurred when invoking code from plug-in: "org.eclipse.jface".
- vs2010 控制台 输出 乱码
- GitHub使用之上传项目
- Andorid 自定义标题栏
- UIGestureRecognizer 真的很好用: 各种手势,
- java 异步调用
- 程序员技术练级攻略