10d6cf65aSLoGin use core::{ 20d6cf65aSLoGin ffi::c_void, 30d6cf65aSLoGin mem::size_of, 40d6cf65aSLoGin ops::{Deref, DerefMut}, 50d6cf65aSLoGin sync::atomic::AtomicI64, 60d6cf65aSLoGin }; 73c82aa56SChiichen 80d6cf65aSLoGin use alloc::{boxed::Box, vec::Vec}; 991e9d4abSLoGin use system_error::SystemError; 103c82aa56SChiichen 113c82aa56SChiichen use crate::{ 123c82aa56SChiichen arch::{ 133c82aa56SChiichen asm::bitops::ffz, 143c82aa56SChiichen interrupt::TrapFrame, 153c82aa56SChiichen ipc::signal::{SigCode, SigFlags, SigSet, Signal, MAX_SIG_NUM}, 163c82aa56SChiichen }, 173c82aa56SChiichen mm::VirtAddr, 183c82aa56SChiichen process::Pid, 1991e9d4abSLoGin syscall::user_access::UserBufferWriter, 203c82aa56SChiichen }; 213c82aa56SChiichen 223c82aa56SChiichen /// 用户态程序传入的SIG_DFL的值 233c82aa56SChiichen pub const USER_SIG_DFL: u64 = 0; 243c82aa56SChiichen /// 用户态程序传入的SIG_IGN的值 253c82aa56SChiichen pub const USER_SIG_IGN: u64 = 1; 263c82aa56SChiichen /// 用户态程序传入的SIG_ERR的值 273c82aa56SChiichen pub const USER_SIG_ERR: u64 = 2; 283c82aa56SChiichen 293c82aa56SChiichen // 因为 Rust 编译器不能在常量声明中正确识别级联的 "|" 运算符(experimental feature: https://github.com/rust-lang/rust/issues/67792),因此 303c82aa56SChiichen // 暂时只能通过这种方法来声明这些常量,这些常量暂时没有全部用到,但是都出现在 linux 的判断逻辑中,所以都保留下来了 313c82aa56SChiichen #[allow(dead_code)] 323c82aa56SChiichen pub const SIG_KERNEL_ONLY_MASK: SigSet = 333c82aa56SChiichen Signal::into_sigset(Signal::SIGSTOP).union(Signal::into_sigset(Signal::SIGKILL)); 343c82aa56SChiichen 353c82aa56SChiichen pub const SIG_KERNEL_STOP_MASK: SigSet = Signal::into_sigset(Signal::SIGSTOP) 363c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGTSTP)) 373c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGTTIN)) 383c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGTTOU)); 393c82aa56SChiichen #[allow(dead_code)] 403c82aa56SChiichen pub const SIG_KERNEL_COREDUMP_MASK: SigSet = Signal::into_sigset(Signal::SIGQUIT) 413c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGILL)) 423c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGTRAP)) 433c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGABRT_OR_IOT)) 443c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGFPE)) 453c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGSEGV)) 463c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGBUS)) 473c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGSYS)) 483c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGXCPU)) 493c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGXFSZ)); 503c82aa56SChiichen #[allow(dead_code)] 513c82aa56SChiichen pub const SIG_KERNEL_IGNORE_MASK: SigSet = Signal::into_sigset(Signal::SIGCONT) 523c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGFPE)) 533c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGSEGV)) 543c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGBUS)) 553c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGTRAP)) 563c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGCHLD)) 573c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGIO_OR_POLL)) 583c82aa56SChiichen .union(Signal::into_sigset(Signal::SIGSYS)); 593c82aa56SChiichen 603c82aa56SChiichen /// SignalStruct 在 pcb 中加锁 613c82aa56SChiichen #[derive(Debug)] 623c82aa56SChiichen pub struct SignalStruct { 630d6cf65aSLoGin inner: Box<InnerSignalStruct>, 640d6cf65aSLoGin } 650d6cf65aSLoGin 660d6cf65aSLoGin #[derive(Debug)] 670d6cf65aSLoGin pub struct InnerSignalStruct { 683c82aa56SChiichen pub cnt: AtomicI64, 693c82aa56SChiichen /// 如果对应linux,这部分会有一个引用计数,但是没发现在哪里有用到需要计算引用的地方,因此 703c82aa56SChiichen /// 暂时删掉,不然这个Arc会导致其他地方的代码十分丑陋 71b5b571e0SLoGin pub handlers: [Sigaction; MAX_SIG_NUM], 723c82aa56SChiichen } 733c82aa56SChiichen 740d6cf65aSLoGin impl SignalStruct { 750d6cf65aSLoGin #[inline(never)] 760d6cf65aSLoGin pub fn new() -> Self { 770d6cf65aSLoGin Self { 78b5b571e0SLoGin inner: Box::<InnerSignalStruct>::default(), 790d6cf65aSLoGin } 800d6cf65aSLoGin } 810d6cf65aSLoGin } 820d6cf65aSLoGin 830d6cf65aSLoGin impl Deref for SignalStruct { 840d6cf65aSLoGin type Target = InnerSignalStruct; 850d6cf65aSLoGin 860d6cf65aSLoGin fn deref(&self) -> &Self::Target { 870d6cf65aSLoGin &self.inner 880d6cf65aSLoGin } 890d6cf65aSLoGin } 900d6cf65aSLoGin 910d6cf65aSLoGin impl DerefMut for SignalStruct { 920d6cf65aSLoGin fn deref_mut(&mut self) -> &mut Self::Target { 930d6cf65aSLoGin &mut self.inner 940d6cf65aSLoGin } 950d6cf65aSLoGin } 960d6cf65aSLoGin 970d6cf65aSLoGin impl Default for InnerSignalStruct { 983c82aa56SChiichen fn default() -> Self { 993c82aa56SChiichen Self { 1003c82aa56SChiichen cnt: Default::default(), 101b5b571e0SLoGin handlers: [Sigaction::default(); MAX_SIG_NUM], 1023c82aa56SChiichen } 1033c82aa56SChiichen } 1043c82aa56SChiichen } 1053c82aa56SChiichen 1063c82aa56SChiichen #[derive(Debug, Copy, Clone)] 1073c82aa56SChiichen #[allow(dead_code)] 1083c82aa56SChiichen pub enum SigactionType { 1093c82aa56SChiichen SaHandler(SaHandlerType), 1103c82aa56SChiichen SaSigaction( 1113c82aa56SChiichen Option< 1123c82aa56SChiichen unsafe extern "C" fn( 1133c82aa56SChiichen sig: ::core::ffi::c_int, 1143c82aa56SChiichen sinfo: *mut SigInfo, 1153c82aa56SChiichen arg1: *mut ::core::ffi::c_void, 1163c82aa56SChiichen ), 1173c82aa56SChiichen >, 1183c82aa56SChiichen ), // 暂时没有用上 1193c82aa56SChiichen } 1203c82aa56SChiichen 1213c82aa56SChiichen impl SigactionType { 1223c82aa56SChiichen /// Returns `true` if the sa handler type is [`SaHandler(SaHandlerType::SigIgnore)`]. 1233c82aa56SChiichen /// 1243c82aa56SChiichen /// [`SigIgnore`]: SaHandlerType::SigIgnore 1253c82aa56SChiichen pub fn is_ignore(&self) -> bool { 126b5b571e0SLoGin return matches!(self, Self::SaHandler(SaHandlerType::Ignore)); 1273c82aa56SChiichen } 1283c82aa56SChiichen /// Returns `true` if the sa handler type is [`SaHandler(SaHandlerType::SigCustomized(_))`]. 1293c82aa56SChiichen /// 1303c82aa56SChiichen /// [`SigCustomized`]: SaHandlerType::SigCustomized(_) 1313c82aa56SChiichen pub fn is_customized(&self) -> bool { 132b5b571e0SLoGin return matches!(self, Self::SaHandler(SaHandlerType::Customized(_))); 1333c82aa56SChiichen } 1343c82aa56SChiichen } 1353c82aa56SChiichen 1363c82aa56SChiichen #[derive(Debug, Copy, Clone)] 1373c82aa56SChiichen #[allow(dead_code)] 1383c82aa56SChiichen pub enum SaHandlerType { 139b5b571e0SLoGin Error, // 暂时没有用上 140b5b571e0SLoGin Default, 141b5b571e0SLoGin Ignore, 142b5b571e0SLoGin Customized(VirtAddr), 1433c82aa56SChiichen } 1443c82aa56SChiichen 145b5b571e0SLoGin impl From<SaHandlerType> for usize { 146b5b571e0SLoGin fn from(value: SaHandlerType) -> Self { 147b5b571e0SLoGin match value { 148b5b571e0SLoGin SaHandlerType::Error => 2, 149b5b571e0SLoGin SaHandlerType::Ignore => 1, 150b5b571e0SLoGin SaHandlerType::Default => 0, 151b5b571e0SLoGin SaHandlerType::Customized(handler) => handler.data(), 1523c82aa56SChiichen } 1533c82aa56SChiichen } 1543c82aa56SChiichen } 1553c82aa56SChiichen 1563c82aa56SChiichen impl SaHandlerType { 1573c82aa56SChiichen /// Returns `true` if the sa handler type is [`SigDefault`]. 1583c82aa56SChiichen /// 1593c82aa56SChiichen /// [`SigDefault`]: SaHandlerType::SigDefault 1603c82aa56SChiichen pub fn is_sig_default(&self) -> bool { 161b5b571e0SLoGin matches!(self, Self::Default) 1623c82aa56SChiichen } 1633c82aa56SChiichen 1643c82aa56SChiichen /// Returns `true` if the sa handler type is [`SigIgnore`]. 1653c82aa56SChiichen /// 1663c82aa56SChiichen /// [`SigIgnore`]: SaHandlerType::SigIgnore 1673c82aa56SChiichen pub fn is_sig_ignore(&self) -> bool { 168b5b571e0SLoGin matches!(self, Self::Ignore) 1693c82aa56SChiichen } 1703c82aa56SChiichen 1713c82aa56SChiichen /// Returns `true` if the sa handler type is [`SigError`]. 1723c82aa56SChiichen /// 1733c82aa56SChiichen /// [`SigError`]: SaHandlerType::SigError 1743c82aa56SChiichen pub fn is_sig_error(&self) -> bool { 175b5b571e0SLoGin matches!(self, Self::Error) 1763c82aa56SChiichen } 1773c82aa56SChiichen } 1783c82aa56SChiichen 1793c82aa56SChiichen /// 信号处理结构体 1803c82aa56SChiichen /// 1813c82aa56SChiichen #[derive(Debug, Copy, Clone)] 1823c82aa56SChiichen pub struct Sigaction { 1833c82aa56SChiichen action: SigactionType, 1843c82aa56SChiichen flags: SigFlags, 1853c82aa56SChiichen mask: SigSet, // 为了可扩展性而设置的sa_mask 1863c82aa56SChiichen /// 信号处理函数执行结束后,将会跳转到这个函数内进行执行,然后执行sigreturn系统调用 1873c82aa56SChiichen restorer: Option<VirtAddr>, 1883c82aa56SChiichen } 1893c82aa56SChiichen 1903c82aa56SChiichen impl Default for Sigaction { 1913c82aa56SChiichen fn default() -> Self { 1923c82aa56SChiichen Self { 193b5b571e0SLoGin action: SigactionType::SaHandler(SaHandlerType::Default), 1943c82aa56SChiichen flags: Default::default(), 1953c82aa56SChiichen mask: Default::default(), 1963c82aa56SChiichen restorer: Default::default(), 1973c82aa56SChiichen } 1983c82aa56SChiichen } 1993c82aa56SChiichen } 2003c82aa56SChiichen 2013c82aa56SChiichen impl Sigaction { 2023c82aa56SChiichen /// 判断传入的信号是否被忽略 2033c82aa56SChiichen /// 2043c82aa56SChiichen /// ## 参数 2053c82aa56SChiichen /// 2063c82aa56SChiichen /// - `sig` 传入的信号 2073c82aa56SChiichen /// 2083c82aa56SChiichen /// ## 返回值 2093c82aa56SChiichen /// 2103c82aa56SChiichen /// - `true` 被忽略 2113c82aa56SChiichen /// - `false`未被忽略 2123c82aa56SChiichen pub fn is_ignore(&self) -> bool { 2133c82aa56SChiichen return self.action.is_ignore(); 2143c82aa56SChiichen } 2153c82aa56SChiichen pub fn new( 2163c82aa56SChiichen action: SigactionType, 2173c82aa56SChiichen flags: SigFlags, 2183c82aa56SChiichen mask: SigSet, 2193c82aa56SChiichen restorer: Option<VirtAddr>, 2203c82aa56SChiichen ) -> Self { 2213c82aa56SChiichen Self { 2223c82aa56SChiichen action, 2233c82aa56SChiichen flags, 2243c82aa56SChiichen mask, 2253c82aa56SChiichen restorer, 2263c82aa56SChiichen } 2273c82aa56SChiichen } 2283c82aa56SChiichen 2293c82aa56SChiichen pub fn action(&self) -> SigactionType { 2303c82aa56SChiichen self.action 2313c82aa56SChiichen } 2323c82aa56SChiichen 2333c82aa56SChiichen pub fn flags(&self) -> SigFlags { 2343c82aa56SChiichen self.flags 2353c82aa56SChiichen } 2363c82aa56SChiichen 2373c82aa56SChiichen pub fn restorer(&self) -> Option<VirtAddr> { 2383c82aa56SChiichen self.restorer 2393c82aa56SChiichen } 2403c82aa56SChiichen 2413c82aa56SChiichen pub fn flags_mut(&mut self) -> &mut SigFlags { 2423c82aa56SChiichen &mut self.flags 2433c82aa56SChiichen } 2443c82aa56SChiichen 2453c82aa56SChiichen pub fn set_action(&mut self, action: SigactionType) { 2463c82aa56SChiichen self.action = action; 2473c82aa56SChiichen } 2483c82aa56SChiichen 2493c82aa56SChiichen pub fn mask(&self) -> SigSet { 2503c82aa56SChiichen self.mask 2513c82aa56SChiichen } 2523c82aa56SChiichen 2533c82aa56SChiichen pub fn mask_mut(&mut self) -> &mut SigSet { 2543c82aa56SChiichen &mut self.mask 2553c82aa56SChiichen } 2563c82aa56SChiichen 2573c82aa56SChiichen pub fn set_restorer(&mut self, restorer: Option<VirtAddr>) { 2583c82aa56SChiichen self.restorer = restorer; 2593c82aa56SChiichen } 2603c82aa56SChiichen 2613c82aa56SChiichen /// 默认信号处理程序占位符(用于在sighand结构体中的action数组中占位) 2623c82aa56SChiichen pub const DEFAULT_SIGACTION: Sigaction = Sigaction { 263b5b571e0SLoGin action: SigactionType::SaHandler(SaHandlerType::Default), 2643c82aa56SChiichen flags: SigFlags::empty(), 2653c82aa56SChiichen mask: SigSet::from_bits_truncate(0), 2663c82aa56SChiichen restorer: None, 2673c82aa56SChiichen }; 2683c82aa56SChiichen 2693c82aa56SChiichen /// 默认的“忽略信号”的sigaction 2703c82aa56SChiichen pub const DEFAULT_SIGACTION_IGNORE: Sigaction = Sigaction { 271b5b571e0SLoGin action: SigactionType::SaHandler(SaHandlerType::Ignore), 2723c82aa56SChiichen flags: SigFlags::empty(), 2733c82aa56SChiichen mask: SigSet::from_bits_truncate(0), 2743c82aa56SChiichen restorer: None, 2753c82aa56SChiichen }; 2763c82aa56SChiichen } 2773c82aa56SChiichen 2783c82aa56SChiichen /// 用户态传入的sigaction结构体(符合posix规范) 2793c82aa56SChiichen /// 请注意,我们会在sys_sigaction函数里面将其转换成内核使用的sigaction结构体 2803c82aa56SChiichen #[repr(C)] 2813c82aa56SChiichen #[derive(Debug, Clone, Copy)] 2823c82aa56SChiichen pub struct UserSigaction { 2833c82aa56SChiichen pub handler: *mut core::ffi::c_void, 2843c82aa56SChiichen pub flags: SigFlags, 2853c82aa56SChiichen pub restorer: *mut core::ffi::c_void, 2863c82aa56SChiichen pub mask: SigSet, 2873c82aa56SChiichen } 2883c82aa56SChiichen 2893c82aa56SChiichen /** 2903c82aa56SChiichen * siginfo中,根据signal的来源不同,该info中对应了不同的数据./= 2913c82aa56SChiichen * 请注意,该info最大占用16字节 2923c82aa56SChiichen */ 2933c82aa56SChiichen 2943c82aa56SChiichen #[repr(C)] 2953c82aa56SChiichen #[derive(Copy, Clone, Debug)] 2963c82aa56SChiichen pub struct SigInfo { 2973c82aa56SChiichen sig_no: i32, 2983c82aa56SChiichen sig_code: SigCode, 2993c82aa56SChiichen errno: i32, 3003c82aa56SChiichen sig_type: SigType, 3013c82aa56SChiichen } 3023c82aa56SChiichen 3033c82aa56SChiichen impl SigInfo { 3043c82aa56SChiichen pub fn sig_code(&self) -> SigCode { 3053c82aa56SChiichen self.sig_code 3063c82aa56SChiichen } 3073c82aa56SChiichen 3083c82aa56SChiichen pub fn set_sig_type(&mut self, sig_type: SigType) { 3093c82aa56SChiichen self.sig_type = sig_type; 3103c82aa56SChiichen } 3113c82aa56SChiichen /// @brief 将siginfo结构体拷贝到用户栈 3123c82aa56SChiichen /// ## 参数 3133c82aa56SChiichen /// 3143c82aa56SChiichen /// `to` 用户空间指针 3153c82aa56SChiichen /// 3163c82aa56SChiichen /// ## 注意 3173c82aa56SChiichen /// 318e7071df6SLoGin /// 该函数对应Linux中的https://code.dragonos.org.cn/xref/linux-6.1.9/kernel/signal.c#3323 319e7071df6SLoGin /// Linux还提供了 https://code.dragonos.org.cn/xref/linux-6.1.9/kernel/signal.c#3383 用来实现 3203c82aa56SChiichen /// kernel_siginfo 保存到 用户的 compact_siginfo 的功能,但是我们系统内还暂时没有对这两种 3213c82aa56SChiichen /// siginfo做区分,因此暂时不需要第二个函数 3223c82aa56SChiichen pub fn copy_siginfo_to_user(&self, to: *mut SigInfo) -> Result<i32, SystemError> { 3233c82aa56SChiichen // 验证目标地址是否为用户空间 3243c82aa56SChiichen let mut user_buffer = UserBufferWriter::new(to, size_of::<SigInfo>(), true)?; 3253c82aa56SChiichen 3263c82aa56SChiichen let retval: Result<i32, SystemError> = Ok(0); 3273c82aa56SChiichen 3283c82aa56SChiichen user_buffer.copy_one_to_user(self, 0)?; 3293c82aa56SChiichen return retval; 3303c82aa56SChiichen } 3313c82aa56SChiichen } 3323c82aa56SChiichen 3333c82aa56SChiichen #[derive(Copy, Clone, Debug)] 3343c82aa56SChiichen pub enum SigType { 3353c82aa56SChiichen Kill(Pid), 336*fbd63a30SSMALLC Alarm(Pid), 3373c82aa56SChiichen // 后续完善下列中的具体字段 3383c82aa56SChiichen // Timer, 3393c82aa56SChiichen // Rt, 3403c82aa56SChiichen // SigChild, 3413c82aa56SChiichen // SigFault, 3423c82aa56SChiichen // SigPoll, 3433c82aa56SChiichen // SigSys, 3443c82aa56SChiichen } 3453c82aa56SChiichen 3463c82aa56SChiichen impl SigInfo { 3473c82aa56SChiichen pub fn new(sig: Signal, sig_errno: i32, sig_code: SigCode, sig_type: SigType) -> Self { 3483c82aa56SChiichen Self { 3493c82aa56SChiichen sig_no: sig as i32, 3503c82aa56SChiichen sig_code, 3513c82aa56SChiichen errno: sig_errno, 3523c82aa56SChiichen sig_type, 3533c82aa56SChiichen } 3543c82aa56SChiichen } 3553c82aa56SChiichen } 3563c82aa56SChiichen 357b5b571e0SLoGin #[derive(Debug, Default)] 3583c82aa56SChiichen pub struct SigPending { 3593c82aa56SChiichen signal: SigSet, 3603c82aa56SChiichen queue: SigQueue, 3613c82aa56SChiichen } 3623c82aa56SChiichen 3633c82aa56SChiichen impl SigPending { 364bf4a4899SLoGin /// 判断是否有待处理的信号 365bf4a4899SLoGin pub fn has_pending(&self) -> bool { 366bf4a4899SLoGin return !self.signal.is_empty(); 367bf4a4899SLoGin } 368bf4a4899SLoGin 3693c82aa56SChiichen pub fn signal(&self) -> SigSet { 3703c82aa56SChiichen self.signal 3713c82aa56SChiichen } 3723c82aa56SChiichen 3733c82aa56SChiichen pub fn queue(&self) -> &SigQueue { 3743c82aa56SChiichen &self.queue 3753c82aa56SChiichen } 3763c82aa56SChiichen 3773c82aa56SChiichen pub fn queue_mut(&mut self) -> &mut SigQueue { 3783c82aa56SChiichen &mut self.queue 3793c82aa56SChiichen } 3803c82aa56SChiichen 3813c82aa56SChiichen pub fn signal_mut(&mut self) -> &mut SigSet { 3823c82aa56SChiichen &mut self.signal 3833c82aa56SChiichen } 3843c82aa56SChiichen /// @brief 获取下一个要处理的信号(sig number越小的信号,优先级越高) 3853c82aa56SChiichen /// 3863c82aa56SChiichen /// @param pending 等待处理的信号 3873c82aa56SChiichen /// @param sig_mask 屏蔽了的信号 3883c82aa56SChiichen /// @return i32 下一个要处理的信号的number. 如果为0,则无效 3893c82aa56SChiichen pub fn next_signal(&self, sig_mask: &SigSet) -> Signal { 3903c82aa56SChiichen let mut sig = Signal::INVALID; 3913c82aa56SChiichen 3923c82aa56SChiichen let s = self.signal(); 3933c82aa56SChiichen let m = *sig_mask; 3943c82aa56SChiichen m.is_empty(); 3953c82aa56SChiichen // 获取第一个待处理的信号的号码 3963c82aa56SChiichen let x = s & (!m); 3973c82aa56SChiichen if x.bits() != 0 { 3983c82aa56SChiichen sig = Signal::from(ffz(x.complement().bits()) + 1); 3993c82aa56SChiichen return sig; 4003c82aa56SChiichen } 4013c82aa56SChiichen 4023c82aa56SChiichen // 暂时只支持64种信号 4033c82aa56SChiichen assert_eq!(MAX_SIG_NUM, 64); 4043c82aa56SChiichen 4053c82aa56SChiichen return sig; 4063c82aa56SChiichen } 4073c82aa56SChiichen /// @brief 收集信号的信息 4083c82aa56SChiichen /// 4093c82aa56SChiichen /// @param sig 要收集的信号的信息 4103c82aa56SChiichen /// @param pending 信号的排队等待标志 4113c82aa56SChiichen /// @return SigInfo 信号的信息 4123c82aa56SChiichen pub fn collect_signal(&mut self, sig: Signal) -> SigInfo { 4133c82aa56SChiichen let (info, still_pending) = self.queue_mut().find_and_delete(sig); 4143c82aa56SChiichen 4153c82aa56SChiichen // 如果没有仍在等待的信号,则清除pending位 4163c82aa56SChiichen if !still_pending { 4173c82aa56SChiichen self.signal_mut().remove(sig.into()); 4183c82aa56SChiichen } 4193c82aa56SChiichen 420b5b571e0SLoGin if let Some(info) = info { 421b5b571e0SLoGin return info; 4223c82aa56SChiichen } else { 4233c82aa56SChiichen // 信号不在sigqueue中,这意味着当前信号是来自快速路径,因此直接把siginfo设置为0即可。 4243c82aa56SChiichen let mut ret = SigInfo::new(sig, 0, SigCode::User, SigType::Kill(Pid::from(0))); 4253c82aa56SChiichen ret.set_sig_type(SigType::Kill(Pid::new(0))); 4263c82aa56SChiichen return ret; 4273c82aa56SChiichen } 4283c82aa56SChiichen } 4293c82aa56SChiichen 4303c82aa56SChiichen /// @brief 从当前进程的sigpending中取出下一个待处理的signal,并返回给调用者。(调用者应当处理这个信号) 4313c82aa56SChiichen /// 请注意,进入本函数前,当前进程应当持有current_pcb().sighand.siglock 4323c82aa56SChiichen pub fn dequeue_signal(&mut self, sig_mask: &SigSet) -> (Signal, Option<SigInfo>) { 4333c82aa56SChiichen // kdebug!("dequeue signal"); 4343c82aa56SChiichen // 获取下一个要处理的信号的编号 4353c82aa56SChiichen let sig = self.next_signal(sig_mask); 4363c82aa56SChiichen 437b5b571e0SLoGin let info: Option<SigInfo> = if sig != Signal::INVALID { 4383c82aa56SChiichen // 如果下一个要处理的信号是合法的,则收集其siginfo 439b5b571e0SLoGin Some(self.collect_signal(sig)) 4403c82aa56SChiichen } else { 441b5b571e0SLoGin None 442b5b571e0SLoGin }; 4433c82aa56SChiichen 4443c82aa56SChiichen // 当一个进程具有多个线程之后,在这里需要重新计算线程的flag中的TIF_SIGPENDING位 4453c82aa56SChiichen // recalc_sigpending(); 4463c82aa56SChiichen return (sig, info); 4473c82aa56SChiichen } 4483c82aa56SChiichen /// @brief 从sigpending中删除mask中被置位的信号。也就是说,比如mask的第1位被置为1,那么就从sigqueue中删除所有signum为2的信号的信息。 4493c82aa56SChiichen pub fn flush_by_mask(&mut self, mask: &SigSet) { 4503c82aa56SChiichen // 定义过滤器,从sigqueue中删除mask中被置位的信号 4511a72a751SLoGin let filter = |x: &SigInfo| !mask.contains(SigSet::from_bits_truncate(x.sig_no as u64)); 4521a72a751SLoGin self.queue.q.retain(filter); 4533c82aa56SChiichen } 4543c82aa56SChiichen } 4553c82aa56SChiichen 4563c82aa56SChiichen /// @brief 进程接收到的信号的队列 457b5b571e0SLoGin #[derive(Debug, Clone, Default)] 4583c82aa56SChiichen pub struct SigQueue { 4593c82aa56SChiichen pub q: Vec<SigInfo>, 4603c82aa56SChiichen } 4613c82aa56SChiichen 4623c82aa56SChiichen #[allow(dead_code)] 4633c82aa56SChiichen impl SigQueue { 4643c82aa56SChiichen /// @brief 初始化一个新的信号队列 4653c82aa56SChiichen pub fn new(capacity: usize) -> Self { 4663c82aa56SChiichen SigQueue { 4673c82aa56SChiichen q: Vec::with_capacity(capacity), 4683c82aa56SChiichen } 4693c82aa56SChiichen } 4703c82aa56SChiichen 4713c82aa56SChiichen /// @brief 在信号队列中寻找第一个满足要求的siginfo, 并返回它的引用 4723c82aa56SChiichen /// 4733c82aa56SChiichen /// @return (第一个满足要求的siginfo的引用; 是否有多个满足条件的siginfo) 4743c82aa56SChiichen pub fn find(&self, sig: Signal) -> (Option<&SigInfo>, bool) { 4753c82aa56SChiichen // 是否存在多个满足条件的siginfo 4763c82aa56SChiichen let mut still_pending = false; 4773c82aa56SChiichen let mut info: Option<&SigInfo> = None; 4783c82aa56SChiichen 4793c82aa56SChiichen for x in self.q.iter() { 4803c82aa56SChiichen if x.sig_no == sig as i32 { 4813c82aa56SChiichen if info.is_some() { 4823c82aa56SChiichen still_pending = true; 4833c82aa56SChiichen break; 4843c82aa56SChiichen } else { 4853c82aa56SChiichen info = Some(x); 4863c82aa56SChiichen } 4873c82aa56SChiichen } 4883c82aa56SChiichen } 4893c82aa56SChiichen return (info, still_pending); 4903c82aa56SChiichen } 4913c82aa56SChiichen 4923c82aa56SChiichen /// @brief 在信号队列中寻找第一个满足要求的siginfo, 并将其从队列中删除,然后返回这个siginfo 4933c82aa56SChiichen /// 4943c82aa56SChiichen /// @return (第一个满足要求的siginfo; 从队列中删除前是否有多个满足条件的siginfo) 4953c82aa56SChiichen pub fn find_and_delete(&mut self, sig: Signal) -> (Option<SigInfo>, bool) { 4963c82aa56SChiichen // 是否存在多个满足条件的siginfo 4973c82aa56SChiichen let mut still_pending = false; 4983c82aa56SChiichen let mut first = true; // 标记变量,记录当前是否已经筛选出了一个元素 4993c82aa56SChiichen 5003c82aa56SChiichen let filter = |x: &mut SigInfo| { 5013c82aa56SChiichen if x.sig_no == sig as i32 { 5023c82aa56SChiichen if !first { 5033c82aa56SChiichen // 如果之前已经筛选出了一个元素,则不把当前元素删除 5043c82aa56SChiichen still_pending = true; 5053c82aa56SChiichen return false; 5063c82aa56SChiichen } else { 5073c82aa56SChiichen // 当前是第一个被筛选出来的元素 5083c82aa56SChiichen first = false; 5093c82aa56SChiichen return true; 5103c82aa56SChiichen } 5113c82aa56SChiichen } 5123c82aa56SChiichen return false; 5133c82aa56SChiichen }; 5143c82aa56SChiichen // 从sigqueue中过滤出结果 5151a72a751SLoGin let mut filter_result: Vec<SigInfo> = self.q.extract_if(filter).collect(); 5163c82aa56SChiichen // 筛选出的结果不能大于1个 5173c82aa56SChiichen assert!(filter_result.len() <= 1); 5183c82aa56SChiichen 5193c82aa56SChiichen return (filter_result.pop(), still_pending); 5203c82aa56SChiichen } 5213c82aa56SChiichen 5223c82aa56SChiichen /// @brief 从C的void*指针转换为static生命周期的可变引用 5233c82aa56SChiichen pub fn from_c_void(p: *mut c_void) -> &'static mut SigQueue { 5243c82aa56SChiichen let sq = p as *mut SigQueue; 5253c82aa56SChiichen let sq = unsafe { sq.as_mut::<'static>() }.unwrap(); 5263c82aa56SChiichen return sq; 5273c82aa56SChiichen } 5283c82aa56SChiichen } 5293c82aa56SChiichen 5303c82aa56SChiichen /// 5313c82aa56SChiichen /// 定义了不同架构下实现 Signal 要实现的接口 5323c82aa56SChiichen /// 5333c82aa56SChiichen pub trait SignalArch { 5343c82aa56SChiichen /// 信号处理函数 5353c82aa56SChiichen /// 5363c82aa56SChiichen /// ## 参数 5373c82aa56SChiichen /// 5383c82aa56SChiichen /// - `frame` 中断栈帧 5393c82aa56SChiichen unsafe fn do_signal(frame: &mut TrapFrame); 5403c82aa56SChiichen 5413c82aa56SChiichen fn sys_rt_sigreturn(trap_frame: &mut TrapFrame) -> u64; 5423c82aa56SChiichen } 543