From ef4550cd6947f56056512126b4d3a3f32932bdc4 Mon Sep 17 00:00:00 2001 From: Xu Shaohua Date: Mon, 5 Aug 2024 14:06:52 +0800 Subject: [PATCH] readme: Handle alarm signal --- README.md | 23 +++++++++++++++++++++++ examples/alarm.rs | 6 ------ src/lib.rs | 23 +++++++++++++++++++++++ 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 09c6a9e8..864ab296 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,29 @@ let ret = unsafe { nc::kill(pid, nc::SIGTERM) }; println!("ret: {:?}", ret); ``` +Or handle signals: +```rust +fn handle_alarm(signum: i32) { + assert_eq!(signum, nc::SIGALRM); +} + +fn main() { + let sa = nc::sigaction_t { + sa_handler: handle_alarm as nc::sighandler_t, + sa_flags: nc::SA_RESTORER, + sa_restorer: nc::restore::get_sa_restorer(), + ..nc::sigaction_t::default() + }; + let ret = unsafe { nc::rt_sigaction(nc::SIGALRM, Some(&sa), None) }; + assert!(ret.is_ok()); + let remaining = unsafe { nc::alarm(1) }; + let ret = unsafe { nc::pause() }; + assert!(ret.is_err()); + assert_eq!(ret, Err(nc::EINTR)); + assert_eq!(remaining, 0); +} +``` + ## Stable version For stable version of rustc, please install a C compiler (`gcc` or `clang`) first. diff --git a/examples/alarm.rs b/examples/alarm.rs index d8f9d119..862370eb 100644 --- a/examples/alarm.rs +++ b/examples/alarm.rs @@ -48,15 +48,9 @@ fn main() { let seconds = 1; let remaining = alarm(seconds); - let mask = nc::sigset_t::default(); let ret = unsafe { nc::rt_sigsuspend(&mask) }; assert!(ret.is_err()); assert_eq!(ret, Err(nc::EINTR)); - assert_eq!(remaining.unwrap(), 0); - - unsafe { - nc::exit(1); - } } diff --git a/src/lib.rs b/src/lib.rs index 03ae8263..68bdeeaa 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -55,6 +55,29 @@ //! assert_eq!(ret, Err(nc::EPERM)); //! ``` //! +//! Or handle signals: +//! ``` +//! fn handle_alarm(signum: i32) { +//! assert_eq!(signum, nc::SIGALRM); +//! } +//! +//! fn main() { +//! let sa = nc::sigaction_t { +//! sa_handler: handle_alarm as nc::sighandler_t, +//! sa_flags: nc::SA_RESTORER, +//! sa_restorer: nc::restore::get_sa_restorer(), +//! ..nc::sigaction_t::default() +//! }; +//! let ret = unsafe { nc::rt_sigaction(nc::SIGALRM, Some(&sa), None) }; +//! assert!(ret.is_ok()); +//! let remaining = unsafe { nc::alarm(1) }; +//! let ret = unsafe { nc::pause() }; +//! assert!(ret.is_err()); +//! assert_eq!(ret, Err(nc::EINTR)); +//! assert_eq!(remaining, 0); +//! } +//! ``` +//! //! Or get system info: //! ```rust //! pub fn cstr_to_str(input: &[u8]) -> &str {