tg_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}