Linux信号实践(1) --Linux信号编程概述
中断
中断是系统对于异步事件的响应, 进程执行代码的过程中可以随时被打断,然后去执行异常处理程序;
计算机系统的中断场景:中断源发出中断信号 -> CPU判断中断是否屏蔽屏蔽以及保护现场 -> CPU(查询中断向量表, 找到中断服务程序的入口地址)执行中断处理程序 ->(处理完中断之后) ->恢复现场,继续执行原来的任务
中断分类
硬件中断(外部中断)
外部中断是指由外部设备通过硬件请求的方式产生的中断,也称为硬件中断
软件中断(内部中断)
内部中断是由CPU运行程序错误或执行内部程序调用引起的一种中断,也称为软件中断(如:执行除0操作, 由用户空间陷入内核空间等)。
信号
信号是UNIX/Linux系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动。信号一般是因为某些错误条件而产生的,比如内存段冲突、浮点处理器错误或者非法指令等;信号是在软件层次上对中断的一种模拟,所以通常把它称为是软中断;
信号与中断的相似点:
(1)采用了相同的异步通信方式;
(2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;
(3)都在处理完毕后返回到原来的断点;
(4)对信号或中断都可进行屏蔽。
信号与中断的区别:
(1)中断有优先级,而信号没有优先级,所有的信号都是平等的;
(2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;
(3)中断响应是及时的,而信号响应通常都有较大的时间延迟。
常用信号
信号名称 |
描述 |
SIGABRT(6) |
进程停止运行 |
SIGALRM |
警告钟 |
SIGFPE |
算述运算例外(如除0) |
SIGHUP |
系统挂断 |
SIGILL |
非法指令 |
SIGINT(2) |
终端中断 |
SIGKILL |
停止进程(此信号不能被忽略或捕获) |
SIGPIPE |
向没有读者的管道写入数据 |
SIGSEGV |
无效内存段访问 |
SIGQUIT |
终端退出 |
SIGTERM |
终止 |
SIGUSR1 |
用户定义信号1 |
SIGUSR2 |
用户定义信号2 |
SIGCHLD |
子进程已经停止或退出 |
SIGCONT |
如果被停止则继续执行 |
SIGSTOP |
停止执行 |
SIGTSTP |
终端停止信号 |
SIGTOUT |
后台进程请求进行写操作 |
SIGTTIN |
后台进程请求进行读操作 |
进程对信号的响应
忽略信号
不采取任何操作、有两个信号不能被忽略:SIGKILL和SIGSTOP。
[为什么进程不能忽略SIGKILL/SIGSTOP信号。(如果应用程序可以忽略这2个信号,系统管理无法杀死、暂停进程,无法对系统进行管理。)]
捕获并处理信号
内核中断正在执行的代码,转去执行先前注册过的处理程序。
执行默认操作
默认操作通常是终止进程,这取决于被发送的信号。
信号的默认操作:通过 man 7 signal 查看
信号安装-signal
typedef void (*__sighandler_t) (int);
#define SIG_ERR ((__sighandler_t) -1)
#define SIG_DFL ((__sighandler_t) 0)
#define SIG_IGN ((__sighandler_t) 1)
__sighandler_t signal(int signum, __sighandler_t handler);
参数
signal是一个带signum和handler两个参数的函数,准备捕捉或屏蔽的信号由参数signum给出,接收到指定信号时将要调用的函数由handler给出
handler这个函数必须有一个int类型的参数(即接收到的信号代码),它本身的类型是void, handler也可以是下面两个特殊值:
SIG_IGN 屏蔽该信号
SIG_DFL 恢复默认行为
//示例1
void handler(int sigNum)
{cout << "recv a signal = " << sigNum << endl;
}int main(int argc, char *argv[])
{signal(SIGINT, handler);while (true)sleep(1);
}
RETURN VALUE
signal() returns the previous value of the signal handler, or SIG_ERR on error.
In the event of an error, errno is set to indicate the cause.
int main(int argc, char *argv[])
{sighandler_t oldHandler = signal(SIGINT, handler);if (oldHandler == SIG_ERR)err_exit("signal error");while (getchar() != '\n')sleep(1);// 等价于 signal(SIGINT, SIG_DFL)if (signal(SIGINT, oldHandler) == SIG_ERR)err_exit("signal error");while (true)sleep(1);
}
//实例: 捕获所有信号, 并打印信号的信息
int main()
{for (int i = 1; i < NSIG; ++i){if (signal(i, sigHandler) == SIG_ERR){cerr << "signal " << i << ": " << strsignal(i) << " set error";cerr << ", errno desc: " << strerror(errno) << endl;}}while (true)pause();
}void sigHandler(int signo)
{cout << "catch a signal, signo = " << signo << ", desc: " << strsignal(signo) << endl;
}
Linux信号实践(1) --Linux信号编程概述相关推荐
- Linux信号实践(4) --可靠信号
Sigaction #include <signal.h> int sigaction(int signum, const struct sigaction *act,struct sig ...
- Linux进程实践(1) --Linux进程编程概述
进程 VS. 程序 什么是程序? 程序是完成特定任务的一系列指令集合. 什么是进程? [1]从用户的角度来看:进程是程序的一次执行过程 [2]从操作系统的核心来看:进程是操作系统分配的内存.CPU时间 ...
- Linux系统编程---6(信号的机制,信号4要素,Linu常规信号表,定时器)
信号的概念 信号在我们的生活中随处可见, 如:古代战争中摔杯为号:现代战争中的信号弹:体育比赛中使用的信号枪- 他们都有共性: 简单 不能携带大量信息,只能带一个标志. 满足某个特设条件才发送. Un ...
- Linux信号实践(2) --信号分类
信号分类 不可靠信号 Linux信号机制基本上是从UNIX系统中继承过来的.早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 1.进程每次处理信号后,就将对信号 ...
- linux下sig_pipe函数,linux socket编程 出现信号SIGPIPE,分析及解决
在编写一个仿QQ软件,C/S模式.出现的问题:当客户机关闭时,服务器也随着关闭,纠结很久之后,我gdb了下,出现下面提示信息: Program received signal SIGPIPE, Bro ...
- linux 进程间广播,Linux系统编程之进程间通信之浅谈信号
我们接着谈Linux学习过程中一个重要的话题--信号. 一.信号的概念: 信号是一种软件中断,它提供了一种处理异步事件的方法,也是进程间唯一的异步通信方式. 二.信号的来源: 1.硬件方式: 当用户按 ...
- Linux信号实践(3) --信号内核表示
信号在内核中的表示 执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending).进程可以选择阻塞(Block)某个信号.被阻塞的信号产生时将保持在未 ...
- Linux系统编程31:进程信号之什么是信号的阻塞及相关术语(递达,未决,pending位图,handler位图)
文章目录 (1)信号相关术语 (2)信号在内核中的表示 前面说过,操作系统发出信号之后,对于进程有可能不是立马就处理的,所以如果不是立即处理,那么在这个空档期间进程究竟对信号做了怎样的处理呢? (1) ...
- 十四、Linux系统编程-信号(一)中断、信号、中断和信号
一.中断 (1).中断概念 中断是用以提高计算机工作效率.增强计算机功能的一项重要技术.最初引入硬件中断,只是出于性能上的考量.如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向 ...
最新文章
- ACM题目:救济金发放
- RPCGEN -M *.x 在pnfsd中的修改。 *_clnt.c
- 将数组放进集合中的简单方法
- 微星主板超频_微星垄断AMD、Intel平台内存超频记录 ITX小板惊人
- quart动态执行定时任务
- 给JavaScript的单个对象定义属性和属性的元数据
- 机器学习笔记2 – sklearn之iris数据集
- 暗时间 刘未鹏
- mvvm oc 框架_IOS开发入门之MVVM框架思想
- GoldenDict音标乱码
- python编写一个程序、判断用户输入的数是正数还是负数_编写一个程序,判断用户输入的数是正数还是负数。_学小易找答案...
- jcp jsr_“ IBM和Red Hat *不应*都保留其JCP EC席位”
- w7测算计算机分级,win7游戏分级系统
- 50天用JavaScript完成50个web项目,我学到了什么?
- 苹果沙盒服务器验证,我收到21004的状态值回复来自苹果的沙盒测试服务器自动再生订阅的IOS?(I'm gett...
- cmd批量修改文件名 增加文字_文件名如何进行批量更改?
- 使用Advanced Installer为LabVIEW应用(exe)制作升级更新程序(updater)
- 干货-5G为人工智能与智能制造赋能
- idea的基本操作:idea的重启
- “云+医疗”时代来临,医疗桌面云市场步入快车道
热门文章
- (软件工程复习核心重点)第十二章软件项目管理习题
- (数据库系统概论|王珊)第四章数据库安全性:习题
- Error: Could not find or load main class org.elasticsearch.tools.JavaVersionChecker
- JS 常用函数二(改变HTML样式)
- linux 获取计算机IP地址、MAC、操作系统、时间、DNS
- 基于visual c++之windows核心编程代码分析(30)Telnet协议编程
- RedHat gcc编译器版本升级到4.8.2支持C++11标准
- 经典编程问题之:选择排序、冒泡排序、汉诺塔游戏,均用js代码实现
- .net 使用RabbitMQ demo
- verilog学习(1)基本语法