libc_core/
signal.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
//! This module provides the `libc` types for Signal.
//!
//! MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/powerpc/bits/signal.h>

pub use crate::arch::{MContext, SignalStackFlags, UContext, UStack};
use num_enum::TryFromPrimitive;

/// POSIX 标准、线程扩展与实时信号枚举定义(信号编号从 1 开始)
/// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/aarch64/bits/signal.h#L118>
#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, TryFromPrimitive)]
pub enum SignalNum {
    /// 终端挂起(Hangup)
    HUP = 1,
    /// 交互式中断(Interrupt)
    INT,
    /// 退出(Quit)
    QUIT,
    /// 非法指令(Illegal instruction)
    ILL,
    /// 断点(Trace/breakpoint trap)
    TRAP,
    /// 异常终止(Abort)
    ABRT,
    /// 总线错误(Bus error)
    BUS,
    /// 浮点异常(Floating-point exception)
    FPE,
    /// 强制终止(Kill,不可被捕获或忽略)
    KILL,
    /// 用户定义信号 1
    USR1,
    /// 段错误(Segmentation fault)
    SEGV,
    /// 用户定义信号 2
    USR2,
    /// 管道破裂(Broken pipe)
    PIPE,
    /// 报警时钟(Alarm clock)
    ALRM,
    /// 终止请求(Termination)
    TERM,
    /// 协处理器堆栈故障(栈浮点错误,仅部分平台支持)
    STKFLT,
    /// 子进程终止或状态变化(Child)
    CHLD,
    /// 继续执行(Continue)
    CONT,
    /// 停止进程(不可忽略)
    STOP,
    /// 终端停止(来自 TTY 的 Ctrl+Z)
    TSTP,
    /// 后台读取控制终端
    TTIN,
    /// 后台写入控制终端
    TTOU,
    /// 紧急条件(Urgent socket)
    URG,
    /// 超过 CPU 时间限制
    XCPU,
    /// 超过文件大小限制
    XFSZ,
    /// 虚拟计时器到期(Virtual alarm)
    VTALRM,
    /// 性能分析计时器到期(Profiling alarm)
    PROF,
    /// 窗口大小改变(Window size change)
    WINCH,
    /// 异步 I/O(I/O now possible)
    IO,
    /// 电源失败(Power failure)
    PWR,
    /// 非法系统调用(Bad syscall)
    SYS,
    /// POSIX 线程:定时器信号
    TIMER,
    /// POSIX 线程:取消信号
    CANCEL,
    /// POSIX 线程:同步调用信号
    SYNCCALL,
    /// 实时信号 3(Real-time signal 3)
    RT3,
    /// 实时信号 4
    RT4,
    /// 实时信号 5
    RT5,
    /// 实时信号 6
    RT6,
    /// 实时信号 7
    RT7,
    /// 实时信号 8
    RT8,
    /// 实时信号 9
    RT9,
    /// 实时信号 10
    RT10,
    /// 实时信号 11
    RT11,
    /// 实时信号 12
    RT12,
    /// 实时信号 13
    RT13,
    /// 实时信号 14
    RT14,
    /// 实时信号 15
    RT15,
    /// 实时信号 16
    RT16,
    /// 实时信号 17
    RT17,
    /// 实时信号 18
    RT18,
    /// 实时信号 19
    RT19,
    /// 实时信号 20
    RT20,
    /// 实时信号 21
    RT21,
    /// 实时信号 22
    RT22,
    /// 实时信号 23
    RT23,
    /// 实时信号 24
    RT24,
    /// 实时信号 25
    RT25,
    /// 实时信号 26
    RT26,
    /// 实时信号 27
    RT27,
    /// 实时信号 28
    RT28,
    /// 实时信号 29
    RT29,
    /// 实时信号 30
    RT30,
    /// 实时信号 31
    RT31,
    /// 最大实时信号(Real-time signal max)
    RTMAX,
}

/// 实时信号(Real-time signals)的起始编号。
pub const REAL_TIME_SIGNAL_NUM: usize = 33;

impl SignalNum {
    /// 从数字构造 `SignalNum` 枚举,如果超出合法范围则返回 `None`。
    #[inline]
    pub fn from_num(num: usize) -> Option<SignalNum> {
        SignalNum::try_from(num as u8).ok()
    }

    /// 获取信号的编号(number)。
    pub const fn num(&self) -> usize {
        *self as usize
    }

    /// 判断是否为实时信号(Real-time Signal)。
    ///
    /// 实时信号从编号 [REAL_TIME_SIGNAL_NUM] 开始。
    pub const fn is_rt(&self) -> bool {
        *self as usize >= REAL_TIME_SIGNAL_NUM
    }

    /// 如果是实时信号,则返回其在实时信号表中的索引(从 1 开始)。
    ///
    /// 例如,编号为 [REAL_TIME_SIGNAL_NUM] 的信号返回 `1`。
    #[inline]
    pub fn real_time_index(&self) -> Option<usize> {
        self.is_rt().then(|| self.num() - 32)
    }

    /// 获取信号的位掩码(bit mask)。
    ///
    /// 信号编号从 1 开始,因此返回值为 `1 << (num - 1)`。
    pub const fn mask(&self) -> u64 {
        bit!(self.num() - 1)
    }
}