Linux 信号机制

信号是Linux系统中的一种软中断机制,分为不可靠信号和可靠信号。不可靠信号不支持排队,可能丢失;而可靠信号支持排队,不会丢失。信号包括如SIGINT、SIGKILL等,用于处理如用户中断、异常情况等。信号的产生可以是硬件事件(如用户输入)或软件调用(如kill())。信号处理发生在进程从内核态转到用户态时,可以有默认处理、自定义处理或忽略三种方式。
摘要由CSDN通过智能技术生成

  信号(signal)是一种软中断,信号机制是进程间通信的一种方式,采用异步通信方式

1. 信号类型

  Linux系统共定义了64种信号,分为两大类:可靠信号与不可靠信号,前32种信号为不可靠信号,后32种为可靠信号

1.1 不可靠信号

  也称为非实时信号,不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值取值区间为1~31

1.2 可靠信号

  也称为实时信号,支持排队, 信号不会丢失, 发多少次, 就可以收到多少次. 信号值取值区间为32~64

2. 信号表

1 SIGHUP 挂起
2 SIGINT 中断
3 SIGQUIT 退出
4 SIGILL 非法指令
5 SIGTRAP 断点或陷阱指令
6 SIGABRT abort发出的信号
7 SIGBUS 非法内存访问
8 SIGFPE 浮点异常
9 SIGKILL kill信号 不能被忽略、处理和阻塞
10 SIGUSR1 用户信号1
11 SIGSEGV 无效内存访问
12 SIGUSR2 用户信号2
13 SIGPIPE 管道破损,没有读端的管道写数据
14 SIGALRM alarm发出的信号
15 SIGTERM 终止信号
16 SIGSTKFLT 栈溢出
17 SIGCHLD 子进程退出 默认忽略
18 SIGCONT 进程继续
19 SIGSTOP 进程停止 不能被忽略、处理和阻塞
20 SIGTSTP 进程停止
21 SIGTTIN 进程停止,后台进程从终端读数据时
22 SIGTTOU 进程停止,后台进程想终端写数据时
23 SIGURG I/O有紧急数据到达当前进程 默认忽略
24 SIGXCPU 进程的CPU时间片到期
25 SIGXFSZ 文件大小的超出上限
26 SIGVTALRM 虚拟时钟超时
27 SIGPROF profile时钟超时
28 SIGWINCH 窗口大小改变 默认忽略
29 SIGIO I/O相关
30 SIGPWR 关机 默认忽略
31 SIGSYS 系统调用异常

3. 信号的产生

3.1 硬件方式

  用户输入:比如在终端上按下组合键ctrl+C,产生SIGINT信号;
  硬件异常:CPU检测到内存非法访问等异常,通知内核生成相应信号,并发送给发生事件的进程

3.2 软件方式

  通过系统调用,发送signal信号:kill(),raise(),sigqueue(),alarm(),setitimer(),abort()

  kernel 使用 kill_proc_info()等
  native 使用 kill() 或者raise()等
  java 使用 Procees.sendSignal()等

4. 信号注册和注销

4.1 注册

  在进程task_struct结构体中有一个未决信号的成员变量 struct sigpending pending。每个信号在进程中注册都会把信号值加入到进程的未决信号集。

  非实时信号发送给进程时,如果该信息已经在进程中注册过,不会再次注册,故信号会丢失;
  实时信号发送给进程时,不管该信号是否在进程中注册过,都会再次注册。故信号不会丢失;

4.2 注销

  非实时信号:不可重复注册,最多只有一个sigqueue结构;当该结构被释放后,把该信号从进程未决信号集中删除,则信号注销完毕;
  实时信号:可重复注册,可能存在多个sigqueue结构;当该信号的所有sigqueue处理完毕后,把该信号从进程未决信号集中删除,则信号注销完毕;

5. 信号处理

  内核处理进程收到的signal是在当前进程的上下文,故进程必须是Running状态。当进程唤醒或者调度后获取CPU,则会从内核态转到用户态时检测是否有signal等待处理,处理完,进程会把相应的未决信号从链表中去掉。

5.1 处理时机

signal信号处理时机: 内核态 -> signal信号处理 -> 用户态:

  在内核态,signal信号不起作用;
  在用户态,signal所有未被屏蔽的信号都处理完毕;
  当屏蔽信号,取消屏蔽时,会在下一次内核转用户态的过程中执行;

5.2 处理方式

进程对信号的处理方式: 有3种

  默认 接收到信号后按默认的行为处理该信号。 这是多数应用采取的处理方式。
  自定义 用自定义的信号处理函数来执行特定的动作
  忽略 接收到信号后不做任何反应

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值