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】关于信号的一些常用函数的更多相关文章

  1. [学习笔记]信号基本概念(中断和信号)/名称及常用信号/信号处理/signal函数实践

    1基本概念 中断 q  中断是系统对于异步事件的响应 q  中断信号 q  中断源 q  现场信息 q  中断处理程序 q  中断向量表 异步事件的响应:进程执行代码的过程中可以随时被打断,然后去执行 ...

  2. (八) 一起学 Unix 环境高级编程 (APUE) 之 信号

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  3. UNIX高级环境编程(13)信号 - 概念、signal函数、可重入函数

    信号就是软中断. 信号提供了异步处理事件的一种方式.例如,用户在终端按下结束进程键,使一个进程提前终止.   1 信号的概念 每一个信号都有一个名字,它们的名字都以SIG打头.例如,每当进程调用了ab ...

  4. java 多线程总结篇2之——Thread类及常用函数

    此片文章主要总结的是Thread类及相关的基础概念和API,首先需要厘清线程调度中的几个基本概念: 一.线程调度的基本方法 1.调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会 ...

  5. MFC常用函数总结

    1.MFC编辑框.静态文本框相关的常用函数 <1>GetDlgItemText(ID ,str) 作用:从对话框中获取文本 第一个参数为要获取的编辑框(或者静态文本框.单选按钮等可以显示内 ...

  6. oracle常用函数及示例

    学习oracle也有一段时间了,发现oracle中的函数好多,对于做后台的程序猿来说,大把大把的时间还要学习很多其他的新东西,再把这些函数也都记住是不太现实的,所以总结了一下oracle中的一些常用函 ...

  7. 总结js常用函数和常用技巧(持续更新)

    学习和工作的过程中总结的干货,包括常用函数.常用js技巧.常用正则表达式.git笔记等.为刚接触前端的童鞋们提供一个简单的查询的途径,也以此来缅怀我的前端学习之路. PS:此文档,我会持续更新. Aj ...

  8. [转]SQL 常用函数及示例

    原文地址:http://www.cnblogs.com/canyangfeixue/archive/2013/07/21/3203588.html --SQL 基础-->常用函数 --===== ...

  9. PHP常用函数、数组方法

    常用函数:rand(); 生成随机数rand(0,50); 范围随机数时间:time(); 取当前时间戳date("Y-m-d H:i:s"); Y:年 m:月份 d:天 H:当前 ...

随机推荐

  1. laravel composer 扩展包开发(超详细)

    laravel composer 扩展包开发(超详细) 置顶 2018年02月05日 11:09:16 Simael__Aex 阅读数:10396    版权声明:转载请注明出处:http://blo ...

  2. UVA10129———欧拉道路

    题目 输入n(n≤100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同(例如 acm,malform,mouse).每个单词最多包含1000 ...

  3. billu_b0x靶场刷题

    https://www.vulnhub.com/ 里面有很多安全环境,只要下载相关镜像,在虚拟机上面搭建运行就可以练习对应靶场了. 第一步.信息收集 nmap扫描内网开放80端口的存活主机  nmap ...

  4. OpenCV2:第三章 读取图像

    一.简介 将图像文件读入内存,可以用cv::imread()函数 二.读取图像 Mat imread(const string& filename,int flags=1); Mat: 如果读 ...

  5. 【传智播客】Libevent学习笔记(四):事件event

    目录 00. 目录 01. 事件概述 02. 创建事件 03. 事件的标志 04. 事件持久性 05. 超时事件 06. 信号事件 07. 设置不使用堆分配的事件 08. 事件的未决和非未决 09. ...

  6. xcode菜单栏

    File  文件 Edit  编辑 View 视图 Navigate 导航 Editor 编辑 Product 产品 Window  窗口 Help 帮助 File  文件 New 新建        ...

  7. 通过洛谷P2639看01背包

    题目描述 Bessie像她的诸多姊妹一样,因为从Farmer John的草地吃了太多美味的草而长出了太多的赘肉.所以FJ将她置于一个及其严格的节食计划之中.她每天不能吃多过H ( <= H &l ...

  8. 基于selenium爬取拉勾网职位信息

    1.selenium Selenium 本是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.而这一特性为爬虫开发提供了一个选择及方向,由于其本身依赖 ...

  9. SpringMVC修改功能

    articleList.jsp <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" ...

  10. maven+struts2环境搭建

    首先在struts2.xml文件配置一个包,在包中配置一个action,新建action,新建视图,在action中定义由method定义的方法,这个方法一定要返回String类型,返回的是视图的名称 ...