diff --git a/kernel/src/time/sleep.rs b/kernel/src/time/sleep.rs index f82878f0..bf802e4d 100644 --- a/kernel/src/time/sleep.rs +++ b/kernel/src/time/sleep.rs @@ -4,6 +4,7 @@ use alloc::{boxed::Box, sync::Arc}; use system_error::SystemError; use crate::{ + arch::ipc::signal::Signal, arch::{CurrentIrqArch, CurrentTimeArch}, exception::InterruptArch, process::ProcessManager, @@ -56,9 +57,25 @@ pub fn nanosleep(sleep_time: PosixTimeSpec) -> Result Result { drop(irq_guard); schedule(SchedMode::SM_NONE); + + // 如果定时器没有超时(被信号中断或其他原因唤醒),则取消定时器 + if !timer.timeout() { + timer.cancel(); + } + let time_remaining: i64 = timeout - TIMER_JIFFIES.load(Ordering::SeqCst) as i64; if time_remaining >= 0 { // 被提前唤醒,返回剩余时间