From 32098d61d3a08d6dcd33fc261cb603f87cbbb7c2 Mon Sep 17 00:00:00 2001 From: Yu Chen Date: Sat, 7 May 2022 11:36:26 +0800 Subject: [PATCH] add usr app: sig_ctrlc for sig testing --- user/src/bin/sig_ctrlc.rs | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 user/src/bin/sig_ctrlc.rs diff --git a/user/src/bin/sig_ctrlc.rs b/user/src/bin/sig_ctrlc.rs new file mode 100644 index 00000000..81b3aadf --- /dev/null +++ b/user/src/bin/sig_ctrlc.rs @@ -0,0 +1,42 @@ +#![no_std] +#![no_main] + +extern crate alloc; + +#[macro_use] +extern crate user_lib; +use user_lib::*; +use user_lib::console::getchar; + +const LF: u8 = 0x0au8; +const CR: u8 = 0x0du8; + +fn func() { + println!("signal_handler: caught signal SIGINT, and exit(1)"); + exit(1); +} + +#[no_mangle] +pub fn main() -> i32 { + println!("sig_ctrlc starting.... Press 'ctrl-c' or 'ENTER' will quit."); + + let mut new = SignalAction::default(); + let old = SignalAction::default(); + new.handler = func as usize; + + println!("sig_ctrlc: sigaction"); + if sigaction(SIGINT, &new, &old) < 0 { + panic!("Sigaction failed!"); + } + println!("sig_ctrlc: getchar...."); + loop { + let c = getchar(); + + println!("Got Char {}", c); + if c == LF || c==CR { + return 0; + } + } + println!("sig_ctrlc: Done"); + 0 +}