Linux信号来源和捕获处理以及signal函数简介
来源:互联网 发布:签署淘宝图片空间协议 编辑:程序博客网 时间:2024/04/24 16:30
1、信号是什么?信号本质是什么?
日常生活中,绿灯是一个信号,停止标牌是一个信号,裁判手势也是一个信号。
信号本质(计算机):软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。
2、信号的来源
信号来自内核, 生成信号的请求来自以下3个地方。
(1)用户
用户可以通过输入Ctrl-C, Ctrl-\等命令,或是终端驱动程序分配给信号控制字符的其他任何键来请求内核产生信号。
(2)内核
当进程执行出错时, 内核给进程发送一个信号。 例如,非法段存取,浮点数溢出,亦或是一个非法指令,内核也利用信号通知进程特定事件发生。
(3)进程
一个进程可以通过系统调用kill给另外一个进程发送信号, 一个进程可以和另一个进程通过信号通信。
3、信号类型
4、信号捕获处理
进程能够通过系统调用signal告诉内核, 它要如何处理信号, 进程有3个选择。
(1)接收默认处理(通常是消亡)
SIGINT的默认处理是消亡, 进程并不一定要使用signal接收默认处理,但是进程能够通过以下调用来恢复默认处理。
signal(SIGINT, SIG_DFL);
(2)忽略信号
程序可以通过以下调用来告诉内核, 它需要忽略SIGINT。
signal(SIGINT, SIG_IGN);
(3)信号处理函数
程序能够告诉内核,当程序到来时应该调用哪个函数。
signal(signum, functionname);
5、信号处理例子
(1)默认处理信号
#include<stdio.h>#include<signal.h> int main(){ signal(SIGINT,SIG_DFL); int i; for( i = 0; i<10;++i) { printf("hello world\n"); sleep(1); } return 0;}
(2)忽略信号
#include<stdio.h>#include<signal.h> int main(){ signal(SIGINT,SIG_IGN); int i; for( i = 0; i<10;++i) { printf("hello world\n"); sleep(1); } return 0;}
(3)使用信号处理处理函数
#include<stdio.h>#include<signal.h> int main(){ void f(int); signal(SIGINT,f); int i; for( i = 0; i<10;++i) { printf("hello world\n"); sleep(1); } return 0;} void f(int signum){ printf("SIGINT\n");}
- Linux信号来源和捕获处理以及signal函数简介
- Linux Signal (7): 捕获信号的alarm和pause函数
- Linux 信号signal处理函数
- Linux 信号signal处理函数
- Linux 信号signal处理函数
- Linux 信号signal处理函数
- Linux 信号signal处理函数
- Linux 信号signal处理函数
- Linux 信号signal处理函数
- Linux 信号signal处理函数
- Linux 信号signal处理函数
- Linux signal() 信号处理函数
- Linux 信号signal处理函数
- linux进程信号处理函数signal和sigaction
- linux之信号处理函数signal和sigaction
- 捕获SIGUER1和SIGUSR2的简单程序 | 信号处理程序 | signal函数
- Linux 信号signal处理函数
- Linux内核-信号之signal处理函数
- 为什么程序员讨厌写文档
- 基于XC7K325T FPGA 2路SRIO FMC 3U VPX板卡
- table()函数
- Python and与or
- overflow:hidden的原理问题
- Linux信号来源和捕获处理以及signal函数简介
- hdu6185 dp+矩阵乘法
- SpringBoot-RabbitMq 简单实例
- mongodb
- GitChat · 移动开发 | 小程序快速上手:三步完成小程序从无到有的开发
- J2SE相关笔记
- linux awk命令
- mybatis简单使用
- java中stringBuilder的用法