Linux学习笔记18——信号1
一 信号的基本概念
信号:是向进程发送的软件通知,通知进程有事件发生。
生成:表示一个信号的产生。
捕获:表示接收到一个信号。
信号的寿命:信号的生成和传递之间的时间间隔。
挂起的信号:已经生成但还未被传递的信号。
二 产生信号
每个信号名都是以SIG开头,信号的名字都定义在signal.h中,POSIX必需的信号如下:
信号 描述
SIGABRT 进程放弃(signal abort)
SIGALRM 告警时钟(signal alarm)
SIGBUS 访问了内存对象中的为定义部分
SIGCHLD 子进程被终止,停止或继续(signal child)
SIGCONT 如果进程被停止了,本信号使进程继续执行(signal continue)
SIGFPE 算术计算中出现了被零除这样的错误
SIGHUP 在控制终端(进程)上挂起(死亡)
SIGILL 无效的硬件指令
SIGINT 交互终端提示信号(通常是Ctrl-C)
SIGKILL 终止(signal kill)
SIGPIPE 向一个没有读程序的管道写入(signal pipe)
SIGQUIT 交互终端终止(通常是Ctrl-l)(signal quit)
SIGSEGV 无效的内存引用
SIGSTOP 执行停止(signal stop)
SIGTERM 终止(signal terminate)
SIGTTIN 后台进程试图进行读操作(signal try to input)
SIGTTOU 后台进程试图进行写操作(signal try to output)
SIGURG 在套接字上有高速宽数据
SIGUSR1 用户定义的信号1
SIGUSR2 用户定义的信号2
1 函数kill
#include <signal.h> int kill(pid_t pid, //进程ID
int sig //信号码
); //成功返回0,不成功返回-1并设置errno
参数pid的取值:>0 kill就向那个ID表示的进程发送信号
=0 kill就向调用程序的进程组成员发送信号
-1 kill就向所有它有权发送信息的进程发送信号
其它负值 就将信号发送到组ID等于|pid|的进程组中去
kill的实现必须检测的错误及相应的错误码:EINVAL:sig是一个无效的或不被支持的信号
EPERM:调用程序没有适当的权限
ESRCH:没有进程或进程组对应于pid
例子:向进程1000发送SIGUSR1
if(kill(,SIGUSR1)){ perro("Failed to send the SIGUSR1 signal"); }
注:查找相关进程ID的常用方法是使用getpid(获取当前进程ID),getppid(获取当前进程的父进程ID),getpgid(获取当前进程的进程组ID),或者通过保存从fork中返回的值来查找。
2 函数raise
#include <signal.h> int raise(int sig); //成功,返回0,不成功如果sig是无效的,raise函数就将error设置为EINVAL
raise函数用来向自己发送一个信号。
例子:使进程向自己发送一个SIGUSR1信号
if(raise(SIGUSR1)!=){ perror("Failed to raise SIGUSR1"); }
3 函数alarm
#include <unistd.h> unsigned alarm(unsigned seconds);
alarm函数用来在seconds秒之后安排发送一个SIGALRM信号,alarm函数从来不报告错误。
三 对信号掩码和信号集的操作
信号掩码:当前被阻塞的信号的集合,类型为sigset_t.
对信号集的操作由以下五个函数组成:
#include <signal.h> int sigaddset(sigset_t *set,int signo); //将signo加入信号集 int sigdelset(sigset_t *set,int signo); //将signo从信号集中删除 int sigemptyset(sigset_t *set); //对信号集初始化,使其不包含任何信号 int sigfillset(sigset_t *set); //对信号集初始化,使其包含所有信号 int sigismember(const sigset_t *set,int signo); //报告signo是否在*set中,如果在,返回1,否则返回0
例子:对信号集twosigs进行初始化,使其包含两个信号SIGINT和SIGQUIT
if((sigemptyset(&twosigs)==- || sigaddset(&twosigs,SIGINT)==- || sigaddset(&twosigs,SIGQUIT)==-)){ perror("Failed to set up signal mask"); }
进程可以用sigprocmask函数来检查或修改它的进程信号掩码,sigprocmask函数可以根据参数how指定的方法修改进程的信号掩码。新的信号掩码由参数set指定,而原先的信号掩码将保存到信号集oset中,声明如下:
#include <signal.h> int signalprocmask(int how, //用来说明信号掩码的修改方式
const sigset_t *restrict set, //指向一个信号集的指针,在修改中要用到这个信号集,如果为NULL,就说明不需要进行修改
sigset_t *restrict oset //如果不为NULL,sigprocmask会将修改之前的信号集放在*oset中返回
);
参数how取以下三个值中的一个:
SIG_BLOCK:向当前被阻塞的信号中添加一个信号集
SIG_UNBLOCK:从当前被阻塞的信号中删除一个信号集
SIG_SETMASK:将指定的信号集设置为被阻塞的信号
例子:将SIGINT添加到进程已经阻塞的信号集中去
sigset_t newsigset; if((sigemptyset(&newsigset)==- || sigaddset(&newsigset,SIGINT)==-)){ perror("Failed to initialize the signal set"); } else if(sigprocmask(SIG_BLOCK,&newsigset,NULL)==-){ perror("Failed to block SIGINT"); }
Linux学习笔记18——信号1的更多相关文章
- Linux学习笔记19——信号2
上一节中讲到了sigprocmask函数,它的作用是检查或修改它的进程信号掩码,这一节我们主要学习捕捉与忽略信号的函数sigaction和等待信号函数. 一 sigaction函数的作用 定义在接收 ...
- Linux学习笔记(18) Shell编程之流程控制
1. if语句 (1) 单分支if条件语句 格式为: # 注意条件判断式两端的空格if [ 条件判断式 ];then 程序员 fi 或者 if[ 条件判断式 ] then 程序 fi 例:判断分区使用 ...
- Linux学习笔记(六) 进程管理
1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...
- Linux 学习笔记
Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...
- Linux 学习笔记之超详细基础linux命令 Part 11
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 10---------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 9
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 8----------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 8
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 7----------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 1
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 说明:主要是在REHL Server 6操作系统下进行的测试 --字符界面虚拟终端与图形界面之间的切 方法:[ ...
- Linux学习笔记-Linux系统简介
Linux学习笔记-Linux系统简介 UNIX与Linux发展史 UNIX是父亲,Linux是儿子. UNIX发行版本 操作系统 公司 硬件平台 AIX IBM PowerPC HP-UX HP P ...
随机推荐
- Java-hibernate的Hello World
hibernate 是对jdbc进行轻量级封装的 orm 框架,充当项目的持久层. 要使用 hibernate首先就需要继续配置, 引包:下载hibernate然后加入jar包 同时引入mysql ...
- DataGrid列的合并
/// <summary> /// DataGrid列的合并 /// 注意:1.DataGrid在绑定的时候进行分组和排序,才能让相同的行放在一起 /// 2.方法应用的时机,应该在Dat ...
- Android手势解锁, 九宫格解锁
给大家介绍一个很好用的手势解锁控件ShapleLocker, 废话不多先上效果图: 这是一个第三方库, 可自己根据UI需求替换图标: 圆圈, 小箭头等等.. github地址: http://pane ...
- SQL内外左右交叉连接
什么是连接查询? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据. 目的:实现多个表查询操作. 一般是用作关联两张或两张以上的数据表时用的.看起来有点抽象,我们举个例子,做两张表:学生表( ...
- 2.Oracle11g体系结构
2.1逻辑存储结构 2.1.1数据块(Data Blocks) 数据块是Oracle逻辑结构中最小的逻辑单位,也是执行数据库输入输出最小的存储单位.通常Oracle数据库是操作系统块的整数倍,如果操作 ...
- 在 Mac OS X 中建立加密的 Zip 压缩 -- 让机密资料加上密码
在 Mac OS X 中要压缩档案的話,基本上就用滑鼠点右鍵选「压缩...」就可以制作 Zip 格式的压缩档,很方便.但如果是机密的资料要透过 Email 等管道传送时,常常会需要建立加密的 Zip ...
- swift 关于闭包和函数
调用函数,有闭包参数时: 函数的实现中:闭包为参数时,有参数返回值类型: 调用闭包时,传入参数 调用函数时:闭包为参数,是闭包的实现,当闭包为最后一个参数时,可写在参数括号外面 即===>函数在 ...
- Azure cache 的配置与应用
最近公司的项目要是用cloud Service 所以研究了下 Azure cache 的配置与使用. 首先创建项目 第二步 配置 cache worker role (1) 点击 cache work ...
- 数据库(学习整理)----2--关于Oracle用户权限的授权和收权
知识点: 1.Oracle数据库中所用的用户等级是平级的!只是每个用户的权限不同而已! 2.在一个用户登录后,可以在自己的登录状态下访问其他用户的数据缓冲区.表.以及表的操作!(只要该用户用权限!) ...
- HDU_1241 Oil Deposits(DFS深搜)
Problem Description The GeoSurvComp geologic survey company is responsible for detecting underground ...