【APUE】关于信号的一些常用函数
kill和raise函数
#include <signal.h>
int kill(pid_t pid,int signo);
int raise(int signo);//两个函数返回值:若成功则返回0,若出错则返回-1
kill函数将信号发送给进程或进程组,raise函数则允许进程向自身发送信号。
调用raise(signo)等价于调用kill(getpid(),signo);
kill的pid参数有4种不同的情况:
pid>0 将该信号发送给进程id为pid的进程
pid==0 将该信号发送给与发送进程属于同一进程组的所有进程,不包括系统进程集
pid<0 将该信号发送给进程组id等于pid的绝对值的进程,不包括系统进程
pid==-1 将该信号发送给发送进程有权限向它们发送信号的系统上的所有进程,不包括系统进程
进程将信号发送给其他进程需要权限,超级用户可将信号发送给任一进程,对于非超级进程,其基本规则是发送者的实际或有效用户id必须等于接收者的实际或有效用户id
POSIX.1将编号为0的信号定义为空信号
alarm和pause函数
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
返回值:0或者以前设置的闹钟时间的余留秒数
alarm函数设置一个计时器,在将来某个指定的时间该计时器会超时,当计时器超时时,产生SIGALRM信号
#include <unistd.h>
int pause(void);
返回值:-1,并将errno设置为EINTR
pause函数将调用进程挂起直至捕捉到一个信号,只有执行了一个信号处理程序并从其返回时,pause才返回。
信号集
信号种类数目可能超过一个整型量所包含的位数,所以一般而言,不能用整型量中的一位代表一种信号,也就是不能用一个整型量表示信号集。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);
int sigdelset(sigset_t *set,int signo);
//以上四个函数成功返回0,出错返回-1
int sigismember(const sigset_t *set,int signo);
所有应用程序在使用信号集前,要对该信号集调用sigemptyset或sigfillset一次,因为c编译器将把未赋初值的外部和静态变量都初始化为0,而这是否与给定系统上信号集的实现相对应却并不清楚。
对所有以信号集作为参数的函数,我们总是以信号集地址作为向其传送的参数。
如果实现的信号数少于一个整型量所包含的位数,则可用一位代表一个信号的方法实现信号集。
sigprocmask函数
信号屏蔽字指进程中被屏蔽的信号集,这些信号因为阻塞而不能传给该进程
sigprocmask函数可以检测或更改信号屏蔽字。
#include <signal.h>
int sigprocmask(int how,const sigset_t *set,sigset_t *oset);
若oset是非空指针,则进程的当前信号屏蔽字通过oset返回,若set是非空指针,则how指示如何修改当前信号屏蔽字,如果set是空指针,则不改变该进程的信号屏蔽字,how的值也无意义
sigpending函数
#include <signal.h>
int sigpending(sigset_t *set);
该函数返回信号集,其中的各个信号对于调用进程是阻塞的而不能传递。
sigaction函数
#include <signal.h>
int sigaction(int signo,const struct sigaction *act,struct sigaction *oact);
该函数的功能是检查或修改与指定信号相关联的处理动作。
参数signo是要检测或修改其具体动作的信号编号。若act指针非空,则要修改其动作。如果oact指针非空,则系统经由oact指针返回该信号的上一个动作。
sigsetjmp和siglongjmp函数
#include <setjmp.h>
int sigsetjmp(sigjmp_buf env,int savemask);
void siglongjmp(sigjmp_buf env,int val);
如果savemask非0,则sigsetjmp在env中保存进程的当前信号屏蔽字,调用siglongjmp时,如果带非0 savemask的sigsetjmp调用已经保存了env,则siglongjmp从其中恢复保存的信号屏蔽字。
sigsuspend函数
更改进程的信号屏蔽字可以阻塞所选择的信号,或解除对它们的阻塞,使用这种技术可以保护不希望由信号中断的代码临界区。如果希望对一个信号解除阻塞,然后pause以等待以前被阻塞的信号发生,如果在解除阻塞时刻和pause之间确实发生了信号,那么该信号可能就丢失了,使得pause永远阻塞。
为此,需要在一个原子操作中先恢复信号屏蔽字,然后使进程休眠。这种功能由sigsuspend函数提供。
#include <signal.h>
int sigsuspend(const sigset_t *sigmask);
将进程的信号屏蔽字设置为由sigmask指向的值。在捕捉到一个信号或发生了一个会终止该进程的信号之前,该进程被挂起。如果捕捉到一个信号而且从该信号处理程序返回,则sigsuspend返回,并且将该进程的信号屏蔽字设置为调用sigsuspend之前的值。
abort函数
#include <stdlib.h>
void abort(void);
abort函数的功能是使异常程序终止。此函数将SIGABRT信号发送给调用进程,ISO C规定,调用abort将向主机环境递送一个未成功终止的通知,其方法是调用raise(SIGABRT)函数。
让进程捕捉SIGABRT的意图是:在进程终止之前由其执行所需的清理操作,如果进程并不在信号处理程序中终止自己,POSIX.1声明当信号处理程序返回时,abort终止该进程。
sleep函数
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
//返回值:0或者未休眠够的秒数
此函数使调用进程被挂起,直到满足以下条件之一:
1)已经过了seconds所指定的时间
2)调用进程捕捉到了一个信号并从信号处理程序返回
参考:
http://blog.chinaunix.net/uid-25120309-id-3301181.html
【APUE】关于信号的一些常用函数的更多相关文章
- [学习笔记]信号基本概念(中断和信号)/名称及常用信号/信号处理/signal函数实践
1基本概念 中断 q 中断是系统对于异步事件的响应 q 中断信号 q 中断源 q 现场信息 q 中断处理程序 q 中断向量表 异步事件的响应:进程执行代码的过程中可以随时被打断,然后去执行 ...
- (八) 一起学 Unix 环境高级编程 (APUE) 之 信号
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- UNIX高级环境编程(13)信号 - 概念、signal函数、可重入函数
信号就是软中断. 信号提供了异步处理事件的一种方式.例如,用户在终端按下结束进程键,使一个进程提前终止. 1 信号的概念 每一个信号都有一个名字,它们的名字都以SIG打头.例如,每当进程调用了ab ...
- java 多线程总结篇2之——Thread类及常用函数
此片文章主要总结的是Thread类及相关的基础概念和API,首先需要厘清线程调度中的几个基本概念: 一.线程调度的基本方法 1.调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会 ...
- MFC常用函数总结
1.MFC编辑框.静态文本框相关的常用函数 <1>GetDlgItemText(ID ,str) 作用:从对话框中获取文本 第一个参数为要获取的编辑框(或者静态文本框.单选按钮等可以显示内 ...
- oracle常用函数及示例
学习oracle也有一段时间了,发现oracle中的函数好多,对于做后台的程序猿来说,大把大把的时间还要学习很多其他的新东西,再把这些函数也都记住是不太现实的,所以总结了一下oracle中的一些常用函 ...
- 总结js常用函数和常用技巧(持续更新)
学习和工作的过程中总结的干货,包括常用函数.常用js技巧.常用正则表达式.git笔记等.为刚接触前端的童鞋们提供一个简单的查询的途径,也以此来缅怀我的前端学习之路. PS:此文档,我会持续更新. Aj ...
- [转]SQL 常用函数及示例
原文地址:http://www.cnblogs.com/canyangfeixue/archive/2013/07/21/3203588.html --SQL 基础-->常用函数 --===== ...
- PHP常用函数、数组方法
常用函数:rand(); 生成随机数rand(0,50); 范围随机数时间:time(); 取当前时间戳date("Y-m-d H:i:s"); Y:年 m:月份 d:天 H:当前 ...
随机推荐
- vscode 用户代码片段 vue初始化模板 Snippet #新加入开头注释 自动生成文件名 开发日期时间等内容
vue文件模板 模板变量 https://code.visualstudio.com/docs/editor/userdefinedsnippets#_variables vue.json { // ...
- 谈谈你对java的理解
这个题目是考察多个方面 但是要回答出关键点: 1.平台无关性 2.GC 3.语言特性.泛型.反射.lamda 4.面向对象 5.类库 6.异常处理
- Dubbo框架的说明
说实话,自己现在做的项目中有用到dubbo,但是我所负责的那一个模块,并没有涉及到dubbo,想学习一下dubbo,之前是没有学习完,这次继续... 一.背景知识总结 二.服务治理 三.Dubbo架构 ...
- 安装Yii2提示Failed to decode response: zlib_decode(): data error错误解决方法
如果是根据官方文档来安装(composer create-project --prefer-dist yiisoft/yii2-app-basic basic),并提示此错误的话,那么请做: 1. 请 ...
- OpenJudge-百练-2755
这道题用递归写的话还是很好写的,我们设递归函数的名称为Ways(w,k) . 它的含义就是,w的大小,取k个物品,有多少种方式. 我们可以知道递归的边界条件就是当w的大小为0的时候,我们的方法数只有一 ...
- 分页语句where条件中的子查询有or关键字优化
背景 开发说: 有段SQL语句,去掉order by很快,有order by之后,查询1小时都无法返回结果. 我叫他把SQL扔给我看下. SQL代码及执行计划 select * from (selec ...
- 5. 在Datadir目录外创建单独表空间
5. 在Datadir目录外创建单独表空间 要在MySQL dadadir之外的位置创建单独表空间,请使用该子句: DATA DIRECTORY = '/path' 在目标目录中,MySQL会创建一个 ...
- 【开发工具安装配置】MyEclipse,Tomcat,Mysql安装配置
配置步骤 注:以下路径仅供参考! 一.MyEclipse10 1. 1 破解版破解说明: (1)下载安装好Myeclipse,先不要运行. (2)打开破解工具目录下的cracker.jar文件或run ...
- 前端基础之CSS_2
摘要 盒子模型 浮动 清除 溢出 定位 模态框 rgba 与 opacity透明区别 一.CCS盒子模型 margin:标签与标签之间的距离,主要用于控制标签周围间的间隔,从视觉上达到相互分开的目的 ...
- Leetcode 306.累加数
累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0'- ...