From 478d68a4de71100413ecde65170b2db688f7fac1 Mon Sep 17 00:00:00 2001 From: LoGin Date: Thu, 12 Jun 2025 01:32:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DSignalStruct=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E7=9A=84=E6=97=B6=E5=80=99,=E6=A0=88=E4=B8=8A?= =?UTF-8?q?=E5=86=85=E5=AD=98=E5=8D=A0=E7=94=A8=E8=BF=87=E5=A4=A7=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20(#1201)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: longjin --- kernel/src/ipc/signal_types.rs | 10 +++++----- kernel/src/process/fork.rs | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) 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);