diff --git a/kernel/src/ipc/signal_types.rs b/kernel/src/ipc/signal_types.rs index 124c3e5d..b6781fd4 100644 --- a/kernel/src/ipc/signal_types.rs +++ b/kernel/src/ipc/signal_types.rs @@ -5,7 +5,7 @@ use core::{ sync::atomic::AtomicI64, }; -use alloc::{boxed::Box, vec::Vec}; +use alloc::vec::Vec; use system_error::SystemError; use crate::{ @@ -60,7 +60,7 @@ pub const SIG_KERNEL_IGNORE_MASK: SigSet = Signal::into_sigset(Signal::SIGCONT) /// SignalStruct 在 pcb 中加锁 #[derive(Debug)] pub struct SignalStruct { - inner: Box, + inner: InnerSignalStruct, } #[derive(Debug)] @@ -69,14 +69,14 @@ pub struct InnerSignalStruct { pub cnt: AtomicI64, /// 如果对应linux,这部分会有一个引用计数,但是没发现在哪里有用到需要计算引用的地方,因此 /// 暂时删掉,不然这个Arc会导致其他地方的代码十分丑陋 - pub handlers: [Sigaction; MAX_SIG_NUM], + pub handlers: Vec, } impl SignalStruct { #[inline(never)] pub fn new() -> Self { let mut r = Self { - inner: Box::::default(), + inner: InnerSignalStruct::default(), }; let mut sig_ign = Sigaction::default(); // 收到忽略的信号,重启系统调用 @@ -115,7 +115,7 @@ impl Default for InnerSignalStruct { fn default() -> Self { Self { cnt: Default::default(), - handlers: [Sigaction::default(); MAX_SIG_NUM], + handlers: vec![Sigaction::default(); MAX_SIG_NUM], } } } diff --git a/kernel/src/process/fork.rs b/kernel/src/process/fork.rs index c150af89..95b840ae 100644 --- a/kernel/src/process/fork.rs +++ b/kernel/src/process/fork.rs @@ -321,7 +321,7 @@ impl ProcessManager { } // log::debug!("Just copy sighand"); - new_pcb.sig_struct_irqsave().handlers = current_pcb.sig_struct_irqsave().handlers; + new_pcb.sig_struct_irqsave().handlers = current_pcb.sig_struct_irqsave().handlers.clone(); if clone_flags.contains(CloneFlags::CLONE_CLEAR_SIGHAND) { flush_signal_handlers(new_pcb.clone(), false);