Skip to main content

tg_rcore_tutorial_signal/
lib.rs

1//! 信号的管理和处理模块。
2//!
3//! 本模块定义了信号处理的核心 trait [`Signal`],
4//! 信号模块的实际实现见 `tg-signal-impl` crate。
5//!
6//! 教程阅读建议:
7//!
8//! - 先看 trait 方法语义(`add_signal` / `handle_signals` / `sig_return`);
9//! - 再到 `tg-signal-impl` 看具体状态机实现。
10
11#![no_std]
12#![deny(warnings, missing_docs)]
13
14extern crate alloc;
15use alloc::boxed::Box;
16use tg_kernel_context::LocalContext;
17pub use tg_signal_defs::{SignalAction, SignalNo, MAX_SIG};
18
19mod signal_result;
20pub use signal_result::SignalResult;
21
22/// 一个信号模块需要对外暴露的接口
23pub trait Signal: Send + Sync {
24    /// 当 fork 一个任务时(在通常的`linux syscall`中,fork是某种参数形式的sys_clone),
25    /// 需要**继承原任务的信号处理函数和掩码**。
26    /// 此时 `task` 模块会调用此函数,根据原任务的信号模块生成新任务的信号模块
27    fn from_fork(&mut self) -> Box<dyn Signal>;
28
29    /// `sys_exec`会使用。** `sys_exec` 不会继承信号处理函数和掩码**
30    fn clear(&mut self);
31
32    /// 添加一个信号
33    fn add_signal(&mut self, signal: SignalNo);
34
35    /// 是否当前正在处理信号
36    fn is_handling_signal(&self) -> bool;
37
38    /// 设置一个信号处理函数,返回设置是否成功。`sys_sigaction` 会使用。
39    /// (**不成功说明设置是无效的,需要在 sig_action 中返回EINVAL**)
40    fn set_action(&mut self, signum: SignalNo, action: &SignalAction) -> bool;
41
42    /// 获取一个信号处理函数的值,返回设置是否成功。`sys_sigaction` 会使用
43    ///(**不成功说明设置是无效的,需要在 sig_action 中返回EINVAL**)
44    fn get_action_ref(&self, signum: SignalNo) -> Option<SignalAction>;
45
46    /// 设置信号掩码,并获取旧的信号掩码,`sys_procmask` 会使用
47    fn update_mask(&mut self, mask: usize) -> usize;
48
49    /// 进程执行结果,可能是直接返回用户程序或存栈或暂停或退出
50    ///
51    /// 内核 trap 返回前通常会调用该函数做一次“信号注入”决策。
52    fn handle_signals(&mut self, current_context: &mut LocalContext) -> SignalResult;
53
54    /// 从信号处理函数中退出,返回值表示是否成功。`sys_sigreturn` 会使用
55    fn sig_return(&mut self, current_context: &mut LocalContext) -> bool;
56}