Linux 信号的基本概念

信号的基本概念

1. 信号的概念

信号是Linux系统响应某些条件产生的一些事件。接收到信号的进程会相应地采取一些行动。

2. 信号的生成

信号是由于某些错误条件而生成的,如内存段冲突、浮点处理器错误或非法指令等。信号的生成其实就是一种软件层次的中断,信号由shell和终端处理器生成来引起中断,信号还可以作为在进程间传递消息或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个进程要么正常结束,要么就是某一个信号把这个进程中断了。

3.信号的响应方式

信号产生之后,进程接收这个信号,然后做出一些响应,做出的响应有三种方式,默认方式、忽略和自定义。改变这三种响应方式要通过系统调用signal()。

与信号有关的系统调用在"signal.h"头文件中有声明。

4. 信号名称的定义

信号的值在系统源码中的定义如下,它们都以SIG开头:

(1)#define SIGHUP 1 连接挂断

(2)#define SIGINT 2 终端中断,键盘按下Ctrl+c时,会产生该信号

(3)#define SIGQUIT 3 终端退出

(4)#define SIGILL 4 *非法指令

(5)#define SIGTRAP 5 由断点指令或其它陷阱(trap)指令产生

(6)#define SIGABRT 6 调用abort函数生成的信号

(7)#define SIGIOT 6 建立CORE文件,执行I/O自陷

(8)#define SIGBUS 7 建立CORE文件,总线错误

(9)#define SIGFPE 8 建立CORE文件,浮点异常

(10)#define SIGKILL 9 终止进程,杀死进程,该信号的响应方式不允许改变

(11)#define SIGUSR1 10 终止进程,用户定义信号1

(12)#define SIGSEGV 11 建立CORE文件,段非法错误

(13)#define SIGUSR2 12 终止进程,用户定义信号2

(14)#define SIGPIPE 13 终止进程、向一个没有读进程的管道写数据,读端关闭的描述符,写端写入时产生,该信号会终止程序

(15)#define SIGALRM 14 终止进程,计时器到时

(16) #define SIGTERM 15 终止进程,软件终止信号,系统kill命令默认发送的信号

(17)#define SIGSTKFLT 16

(18)#define SIGCHLD 17 忽略信号,当子进程停止或退出时会默认给父进程发送该信号

(19)#define SIGCONT 18 忽略信号,继续执行一个停止的进程

(20)#define SIGSTOP 19 停止进程 非终端来的停止信号

(21)#define SIGTSTP 20 停止进程,终端来的停止信号 Ctrl+Z

(22)#define SIGTTIN 21 停止进程,后台进程读终端

(23)#define SIGTTOU 22 停止进程,后台进程写终端

(24)#define SIGURG 23 忽略信号,I/O紧急信号

5.信号的实现

收到信号的实体是一个进程,信号的实现在进程的PCB中记录,在PCB中有一个长整型变量signa:long a;,它有32个位,一开始它的值都为0,表示没有收到信号,假如现在通过kill(pid,sig)发送了一个信号,然后通过pid找到对应的PCB中的a,如果通过信号代号把a的1偏移对应的代号个位置,就代表当前进程收到了对应的代号的信号,接下来要处理这个信号,处理完这个信号的时候在把a恢复成0就可以了。如果极短时间内连续发送多个代号相同的信号,其实只能响应一次,因为第一次发送该信号时就已经把a的1偏移了对应的代号个位置,后面再发送相同的信号时是没有变化的,所以当a发生偏移还没有恢复之前,连续发送相同的信号没有意义。

相关推荐
鳄鱼皮坡4 分钟前
仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器
运维·服务器
即将头秃的程序媛16 分钟前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos
fangeqin25 分钟前
ubuntu源码安装python3.13遇到Could not build the ssl module!解决方法
linux·python·ubuntu·openssl
小Mie不吃饭41 分钟前
FastAPI 小白教程:从入门级到实战(源码教程)
运维·服务器
fo安方2 小时前
运维的利器–监控–zabbix–第三步:配置zabbix–中间件–Tomcat–步骤+验证
运维·中间件·zabbix
爱奥尼欧2 小时前
【Linux 系统】基础IO——Linux中对文件的理解
linux·服务器·microsoft
戒不掉的伤怀2 小时前
【Navicat 连接MySQL时出现错误1251:客户端不支持服务器请求的身份验证协议;请考虑升级MySQL客户端】
服务器·数据库·mysql
超喜欢下雨天2 小时前
服务器安装 ros2时遇到底层库依赖冲突的问题
linux·运维·服务器·ros2
搬码临时工2 小时前
小企业如何搭建本地私有云服务器,并设置内部网络地址提供互联网访问
运维·服务器
old-six-programmer3 小时前
NAT 类型及 P2P 穿透
服务器·网络协议·webrtc·p2p·nat