diff --git a/os/src/task/mod.rs b/os/src/task/mod.rs index f03bfe4d..457d2bf9 100644 --- a/os/src/task/mod.rs +++ b/os/src/task/mod.rs @@ -9,7 +9,6 @@ mod action; mod task; use crate::fs::{open_file, OpenFlags}; -use crate::mm::translated_refmut; use alloc::sync::Arc; pub use context::TaskContext; use lazy_static::*; @@ -127,7 +126,6 @@ fn call_kernel_signal_handler(signal: SignalFlags) { } fn call_user_signal_handler(sig: usize, signal: SignalFlags) { - let token = current_user_token(); let task = current_task().unwrap(); let mut task_inner = task.inner_exclusive_access(); diff --git a/user/src/bin/sig_tests.rs b/user/src/bin/sig_tests.rs index 807f2bf4..a5cbce08 100644 --- a/user/src/bin/sig_tests.rs +++ b/user/src/bin/sig_tests.rs @@ -11,6 +11,17 @@ fn func() { sigreturn(); } +fn func2() { + loop { + print!(""); + } +} + +fn func3() { + println!("interrupt"); + sigreturn(); +} + fn user_sig_test_failsignum() { let mut new = SignalAction::default(); let old = SignalAction::default(); @@ -113,6 +124,38 @@ fn kernel_sig_test_failignorekill() { } } +fn final_sig_test() { + let mut new = SignalAction::default(); + let old = SignalAction::default(); + new.handler = func2 as usize; + + let mut new2 = SignalAction::default(); + let old2 = SignalAction::default(); + new2.handler = func3 as usize; + + let pid= fork(); + if pid == 0{ + if sigaction(10, &new, &old) < 0 { + panic!("Sigaction failed!"); + } + if sigaction(14, &new2, &old2) < 0 { + panic!("Sigaction failed!"); + } + if kill(getpid() as usize, 1 << 10) < 0 { + println!("Kill failed!"); + exit(-1); + } + } else { + sleep(1000); + if kill(pid as usize, 1 << 14) < 0 { + println!("Kill failed!"); + exit(-1); + } + sleep(1000); + kill(pid as usize, SignalFlags::SIGKILL.bits()); + } +} + fn run(f: fn()) -> bool { let pid = fork(); @@ -133,14 +176,15 @@ fn run(f: fn()) -> bool { #[no_mangle] pub fn main() -> i32 { - let tests: [(fn(), &str); 7] = [ + let tests: [(fn(), &str); 8] = [ (user_sig_test_failsignum, "user_sig_test_failsignum"), (user_sig_test_kill, "user_sig_test_kill"), (user_sig_test_multiprocsignals, "user_sig_test_multiprocsignals"), (user_sig_test_restore, "user_sig_test_restore"), (kernel_sig_test_ignore, "kernel_sig_test_ignore"), (kernel_sig_test_stop_cont, "kernel_sig_test_stop_cont"), - (kernel_sig_test_failignorekill, "kernel_sig_test_failignorekill") + (kernel_sig_test_failignorekill, "kernel_sig_test_failignorekill"), + (final_sig_test, "final_sig_test") ]; let mut fail_num = 0; for test in tests {