中断

中断是系统对于异步事件的响应, 进程执行代码的过程中可以随时被打断,然后去执行异常处理程序;

计算机系统的中断场景:中断源发出中断信号 -> 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信号编程概述相关推荐

  1. Linux信号实践(4) --可靠信号

    Sigaction #include <signal.h> int sigaction(int signum, const struct sigaction *act,struct sig ...

  2. Linux进程实践(1) --Linux进程编程概述

    进程 VS. 程序 什么是程序? 程序是完成特定任务的一系列指令集合. 什么是进程? [1]从用户的角度来看:进程是程序的一次执行过程 [2]从操作系统的核心来看:进程是操作系统分配的内存.CPU时间 ...

  3. Linux系统编程---6(信号的机制,信号4要素,Linu常规信号表,定时器)

    信号的概念 信号在我们的生活中随处可见, 如:古代战争中摔杯为号:现代战争中的信号弹:体育比赛中使用的信号枪- 他们都有共性: 简单 不能携带大量信息,只能带一个标志. 满足某个特设条件才发送. Un ...

  4. Linux信号实践(2) --信号分类

    信号分类 不可靠信号 Linux信号机制基本上是从UNIX系统中继承过来的.早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 1.进程每次处理信号后,就将对信号 ...

  5. linux下sig_pipe函数,linux socket编程 出现信号SIGPIPE,分析及解决

    在编写一个仿QQ软件,C/S模式.出现的问题:当客户机关闭时,服务器也随着关闭,纠结很久之后,我gdb了下,出现下面提示信息: Program received signal SIGPIPE, Bro ...

  6. linux 进程间广播,Linux系统编程之进程间通信之浅谈信号

    我们接着谈Linux学习过程中一个重要的话题--信号. 一.信号的概念: 信号是一种软件中断,它提供了一种处理异步事件的方法,也是进程间唯一的异步通信方式. 二.信号的来源: 1.硬件方式: 当用户按 ...

  7. Linux信号实践(3) --信号内核表示

    信号在内核中的表示 执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending).进程可以选择阻塞(Block)某个信号.被阻塞的信号产生时将保持在未 ...

  8. Linux系统编程31:进程信号之什么是信号的阻塞及相关术语(递达,未决,pending位图,handler位图)

    文章目录 (1)信号相关术语 (2)信号在内核中的表示 前面说过,操作系统发出信号之后,对于进程有可能不是立马就处理的,所以如果不是立即处理,那么在这个空档期间进程究竟对信号做了怎样的处理呢? (1) ...

  9. 十四、Linux系统编程-信号(一)中断、信号、中断和信号

    一.中断 (1).中断概念       中断是用以提高计算机工作效率.增强计算机功能的一项重要技术.最初引入硬件中断,只是出于性能上的考量.如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向 ...

最新文章

  1. ACM题目:救济金发放
  2. RPCGEN -M *.x 在pnfsd中的修改。 *_clnt.c
  3. 将数组放进集合中的简单方法
  4. 微星主板超频_微星垄断AMD、Intel平台内存超频记录 ITX小板惊人
  5. quart动态执行定时任务
  6. 给JavaScript的单个对象定义属性和属性的元数据
  7. 机器学习笔记2 – sklearn之iris数据集
  8. 暗时间 刘未鹏
  9. mvvm oc 框架_IOS开发入门之MVVM框架思想
  10. GoldenDict音标乱码
  11. python编写一个程序、判断用户输入的数是正数还是负数_编写一个程序,判断用户输入的数是正数还是负数。_学小易找答案...
  12. jcp jsr_“ IBM和Red Hat *不应*都保留其JCP EC席位”
  13. w7测算计算机分级,win7游戏分级系统
  14. 50天用JavaScript完成50个web项目,我学到了什么?
  15. 苹果沙盒服务器验证,我收到21004的状态值回复来自苹果的沙盒测试服务器自动再生订阅的IOS?(I'm gett...
  16. cmd批量修改文件名 增加文字_文件名如何进行批量更改?
  17. 使用Advanced Installer为LabVIEW应用(exe)制作升级更新程序(updater)
  18. 干货-5G为人工智能与智能制造赋能
  19. idea的基本操作:idea的重启
  20. “云+医疗”时代来临,医疗桌面云市场步入快车道

热门文章

  1. (软件工程复习核心重点)第十二章软件项目管理习题
  2. (数据库系统概论|王珊)第四章数据库安全性:习题
  3. Error: Could not find or load main class org.elasticsearch.tools.JavaVersionChecker
  4. JS 常用函数二(改变HTML样式)
  5. linux 获取计算机IP地址、MAC、操作系统、时间、DNS
  6. 基于visual c++之windows核心编程代码分析(30)Telnet协议编程
  7. RedHat gcc编译器版本升级到4.8.2支持C++11标准
  8. 经典编程问题之:选择排序、冒泡排序、汉诺塔游戏,均用js代码实现
  9. .net 使用RabbitMQ demo
  10. verilog学习(1)基本语法