Skip to main content

tg_signal_defs/
lib.rs

1//! 信号定义模块。
2//!
3//! 本模块定义了 POSIX 信号相关的常量和类型,包括:
4//! - [`SignalNo`] - 信号编号枚举
5//! - [`SignalAction`] - 信号处理函数定义
6//! - [`MAX_SIG`] - 最大信号编号
7//!
8//! 教程提示:本 crate 只放“跨内核/用户共享的数据结构”,不包含处理逻辑。
9
10#![no_std]
11#![deny(warnings, missing_docs)]
12
13#[repr(C)]
14#[derive(Debug, Clone, Copy, Default)]
15/// 信号处理函数的定义
16pub struct SignalAction {
17    /// 信号处理函数的地址
18    pub handler: usize,
19    /// 信号掩码
20    pub mask: usize,
21}
22
23/// 最大的信号编号
24pub const MAX_SIG: usize = 31;
25
26// 信号标号的定义
27// 目前 rCore-Tutorial 没有用到 [32, 64) 部分的实时信号,但仍给出定义
28numeric_enum_macro::numeric_enum! {
29    #[repr(u8)]
30    #[allow(missing_docs)]
31    #[derive(Eq, PartialEq, Debug, Copy, Clone)]
32    /// 信号编号。
33    ///
34    /// 从 32 开始的部分为 SIGRT,其中 RT 表示 real time。
35    /// 但目前实现时没有通过 ipi 等手段即时处理,而是像其他信号一样等到 trap 再处理
36    pub enum SignalNo {
37        ERR = 0,
38        SIGHUP = 1,
39        SIGINT = 2,
40        SIGQUIT = 3,
41        SIGILL = 4,
42        SIGTRAP = 5,
43        SIGABRT = 6,
44        SIGBUS = 7,
45        SIGFPE = 8,
46        SIGKILL = 9,
47        SIGUSR1 = 10,
48        SIGSEGV = 11,
49        SIGUSR2 = 12,
50        SIGPIPE = 13,
51        SIGALRM = 14,
52        SIGTERM = 15,
53        SIGSTKFLT = 16,
54        SIGCHLD = 17,
55        SIGCONT = 18,
56        SIGSTOP = 19,
57        SIGTSTP = 20,
58        SIGTTIN = 21,
59        SIGTTOU = 22,
60        SIGURG = 23,
61        SIGXCPU = 24,
62        SIGXFSZ = 25,
63        SIGVTALRM = 26,
64        SIGPROF = 27,
65        SIGWINCH = 28,
66        SIGIO = 29,
67        SIGPWR = 30,
68        SIGSYS = 31,
69        SIGRTMIN = 32,
70        SIGRT1 = 33,
71        SIGRT2 = 34,
72        SIGRT3 = 35,
73        SIGRT4 = 36,
74        SIGRT5 = 37,
75        SIGRT6 = 38,
76        SIGRT7 = 39,
77        SIGRT8 = 40,
78        SIGRT9 = 41,
79        SIGRT10 = 42,
80        SIGRT11 = 43,
81        SIGRT12 = 44,
82        SIGRT13 = 45,
83        SIGRT14 = 46,
84        SIGRT15 = 47,
85        SIGRT16 = 48,
86        SIGRT17 = 49,
87        SIGRT18 = 50,
88        SIGRT19 = 51,
89        SIGRT20 = 52,
90        SIGRT21 = 53,
91        SIGRT22 = 54,
92        SIGRT23 = 55,
93        SIGRT24 = 56,
94        SIGRT25 = 57,
95        SIGRT26 = 58,
96        SIGRT27 = 59,
97        SIGRT28 = 60,
98        SIGRT29 = 61,
99        SIGRT30 = 62,
100        SIGRT31 = 63,
101    }
102}
103
104impl From<usize> for SignalNo {
105    fn from(num: usize) -> Self {
106        Self::try_from(num as u8).unwrap_or(Self::ERR)
107    }
108}