POSIX信号和自定义signal函数
一、信号的概念
信号(signal)就是告知某个进程发生了某个事件的通知;信号通常是异步发生的,也就是说接受信号的进程不知道信号的准确
发生时刻;信号可以(1)由一个进程发给另一个进程;(2)由内核发给某个进程
二、信号的处置
每个信号都有一个与之关联的处置,即收到特定信号时的处理方法;可以通过调用sigaction函数来设定一个信号的处置

(POSIX明确规定了调用sigaction时的语义定义,因此我们自定义signal并调用sigaction,以所期望的POSIX语义提供一个简单的接口)
处置方法有三种:
(1)提供一个函数,只要有特定信号发生它就被调用,这样的函数称为信号处理函数,这种行为称为捕获信号;有两个信号SIGKILL和
SIGSTOP不能被捕获;信号处理函数由信号值这个单一的整数参数来调用,且没有返回值,其函数原型如下:
void handler(int signo);
(2)可以把某个信号的处置方法设定为SIG_IGN来忽略它;SIDKILL和SIDSTOP这两个信号不能被忽略;
(3)可以把某个信号的处置方法设定为SIG_DEF来启用它的默认处置;有个别信号的默认处置为忽略,如SIGCHLD和SIGURG
三、signal函数
#include <signal.h>
typedef void Sigfunc(int);
Sigfunc *signal(int signo, Sigfunc *func) {
struct sigaction act, oact;
act.sa_handler = func; /* 设置处置方法 */
sigemptyset(&act.sa_mask); /* 把sa_mask置为空集,在信号处理期间不阻塞额外的信号 */
act.sa_flags = ;
if (signo != SIGALRM) { /* 在POSIX兼容的平台上,SIGALRM是在定时器终止时发送给进程的信号 */
act.sa_flags |= SA_RESTART;
}
if (sigaction(signo, &act, &oact) < ) {
return SIG_ERR;
}
return (oact.sa_handler);
}
注:a |= b 即 a = a|b,其中|表示位或;a &= b 即 a = a&b,其中&表示位与
四、处理每个信号的选项标志(sa_flags)

五、信号列表
信号 取值 默认动作 含义(发出信号的原因)
SIGHUP Term 终端的挂断或进程死亡
SIGINT Term 来自键盘的中断信号
SIGQUIT Core 来自键盘的离开信号
SIGILL Core 非法指令
SIGABRT Core 来自abort的异常信号
SIGFPE Core 浮点例外
SIGKILL Term 杀死
SIGSEGV Core 段非法错误(内存引用无效)
SIGPIPE Term 管道损坏:向一个没有读进程的管道写数据
SIGALRM Term 来自alarm的计时器到时信号
SIGTERM Term 终止
SIGUSR1 ,, Term 用户自定义信号1
SIGUSR2 ,, Term 用户自定义信号2
SIGCHLD ,, Ign 子进程停止或终止
SIGCONT ,, Cont 如果停止,继续执行
SIGSTOP ,, Stop 非来自终端的停止信号
SIGTSTP ,, Stop 来自终端的停止信号
SIGTTIN ,, Stop 后台进程读终端
SIGTTOU ,, Stop 后台进程写终端
SIGBUS ,, Core 总线错误(内存访问错误)
SIGPOLL Term Pollable事件发生(Sys V),与SIGIO同义
SIGPROF ,, Term 统计分布图用计时器到时
SIGSYS ,-, Core 非法系统调用(SVr4)
SIGTRAP Core 跟踪/断点自陷
SIGURG ,, Ign socket紧急信号(.2BSD)
SIGVTALRM ,, Term 虚拟计时器到时(.2BSD)
SIGXCPU ,, Core 超过CPU时限(.2BSD)
SIGXFSZ ,, Core 超过文件长度限制(.2BSD)
SIGIOT Core IOT自陷,与SIGABRT同义
SIGEMT ,-, Term
SIGSTKFLT -,,- Term 协处理器堆栈错误(不使用)
SIGIO ,, Term 描述符上可以进行I/O操作
SIGCLD -,-, Ign 与SIGCHLD同义
SIGPWR ,, Term 电力故障(System V)
SIGINFO ,-,- 与SIGPWR同义
SIGLOST -,-,- Term 文件锁丢失
SIGWINCH ,, Ign 窗口大小改变(.3BSD, Sun)
SIGUNUSED -,,- Term 未使用信号(will be SIGSYS)
六、POSIX信号语义小结
(1)一旦安装了信号处理函数,它便一直安装着(较早期的系统是每执行一次就将其拆除);
(2)在一个信号处理函数运行期间,正被递交的信号是阻塞的;并且,安装处理函数时在递交给sigaction函数的sa_mask信号集中
指定的任何额外信号也被阻塞;
(3)如果一个信号在被阻塞期间产生了一次或多次,那么该信号被解阻塞之后通常只递交一次,也就是说Unix信号默认是不排队的;
(4)利用sigprocmask函数选择性地阻塞或解阻塞一组信号是可能的;这使得我们可以做到在一段临界区代码执行期间,防止捕获某
些信号,以此保护这段代码
POSIX信号和自定义signal函数的更多相关文章
- UNIX高级环境编程(13)信号 - 概念、signal函数、可重入函数
信号就是软中断. 信号提供了异步处理事件的一种方式.例如,用户在终端按下结束进程键,使一个进程提前终止. 1 信号的概念 每一个信号都有一个名字,它们的名字都以SIG打头.例如,每当进程调用了ab ...
- signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数
信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...
- 三十、Linux 进程与信号——信号的概念及 signal 函数
30.1 信号的基本概念 信号(signal)机制是Linux 系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化 信号是软件中断 信号是异步事件 ...
- Linux下利用signal函数处理ctrl+c等信号
前言 linux下能够通过信号机制来实现程序的软中断,是一个很实用的编程方法. 我们平时在程序执行的时候按下ctrl-c.ctrl-z或者kill一个进程的时候事实上都等效于向这个进程发送了一个特定信 ...
- 异步处理方式之信号(一):基础知识和signal函数说明
文章目录 1. 引言 2. 信号的概念 2.1 信号操作之忽略信号 2.2 信号操作之捕捉信号 2.3 信号操作之执行系统默认操作 2.4 常见的信号 3. 函数signal 3.1 signal函数 ...
- Linux 信号(二)—— signal 函数
弗洛伊德认为:要解决这些苦恼,当事人就要通过回忆并理解自己早期的童年经历,来获得对潜意识冲突的顿悟.弗洛伊德的疗法被称为“精神分析” (psychoanalysis),在 20 世纪的很长一段时间被心 ...
- Linux 信号详解一(signal函数)
信号列表 SIGABRT 进程停止运行 SIGALRM 警告钟 SIGFPE 算述运算例外 SIGHUP 系统挂断 SIGILL 非法指令 SIGINT 终端中断 SIGKILL 停止进程(此信号不能 ...
- 信号之signal函数
UNIX系统的信号机制最简单的接口是signal函数.signal函数的功能:为指定的信号安装一个新的信号处理函数. #include <signal.h> void (*signal(i ...
- UNIX环境高级编程——信号基本概述和signal函数
一.为了理解信号,先从我们最熟悉的场景说起:1. 用户输入命令,在Shell下启动一个前台进程.2. 用户按下Ctrl-C,这个键盘输入产生一个硬件中断.3. 如果CPU当前正在执行这个进程的代码,则 ...
随机推荐
- nginx日志分析 GoAccess
也可以生成json:goaccess -q -f web.log -a -p /home/yejianfeng/.goaccessrc -o json >test.json 和csvgoacce ...
- LOJ#6278. 数列分块入门 2
在一个区间上进行操作,一种操作是某个小区间都加上c,另一个查找这个区间内大于c*c的数 我们可以另外开一个数组在保存a中的每个分块内的相对值,然后每次对a加值,并把a的值赋给b,不同的是b内的各个分块 ...
- 【165223&165218】结对感想——论如何与队友完美配合
★ 为什么要结对编程? 一.结对编程的优势 搭档的形式 平等.互补 高效率.共分享 相互影响.督促学习 方便复审与反馈 二.结对编程的方式 互换的角色 相同的目的 结对编程中有两个角色: (a)驾驶员 ...
- 假如你不小心干掉了系统,你该怎么办?(一次手贱的记录 ~ Ubuntu and Python3.6)
前言 多年未犯低级错误,今天犯了个不大不小的错误,记录下生活点滴吧 今天早上脑海里想了下,如果电脑挂了我要备份哪些东西?然后中午休息的时候就列了一下,没想到晚上就悲剧了... 这个是中午写的: ## ...
- Ubuntu18.04 下的Gif录制工具
正文: 开源地址:https://github.com/phw/peek Linux包相关的知识如果不知道可以看以前讲的:https://www.cnblogs.com/dunitian/p/9095 ...
- javascript之判断专题
javascript有数组,对象,函数,字符串,布尔,还有Symbol,set,map,weakset,weakmap. 判断这些东西也是有很多坑,像原生的typeof,instanceOf有一些bu ...
- 【洛谷P1082】同余方程
题目大意:求关于 \(x\) 的同余方程 \[ax \equiv 1 \pmod {b}\] 的最小正整数解. 题解:exgcd 板子题. 代码如下 #include <bits/stdc++. ...
- Django(十八)Model操作补充
参考博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html 1. 创建类 class UserInfo(model.Model): age = ...
- numpy的使用方法
一.numpy快速入门 1.什么是numpy: numpy是python的一个矩阵类型,提供了大量矩阵处理的函数,非正式来说,就是一个使运算更容易,执行更迅速的库,因为它的内部运算是通过c语言而不是p ...
- shell数组等基本用法
"shell"既是一种解释型编程语言,也是一个这种编程语言的解释器的名字 shell是解释型语言,就是解释器会一条一条的翻译每一条语句并执行,对比之下,C语言是编译型语言,编译器把 ...