//! A crate to wait on a child process with a particular timeout. //! //! This crate is an implementation for Unix and Windows of the ability to wait //! on a child process with a timeout specified. On Windows the implementation //! is fairly trivial as it's just a call to `WaitForSingleObject` with a //! timeout argument, but on Unix the implementation is much more involved. The //! current implementation registers a `SIGCHLD` handler and initializes some //! global state. This handler also works within multi-threaded environments. //! If your application is otherwise handling `SIGCHLD` then bugs may arise. //! //! # Example //! //! ```no_run //! use std::process::Command; //! use wait_timeout::ChildExt; //! use std::time::Duration; //! //! let mut child = Command::new("foo").spawn().unwrap(); //! //! let one_sec = Duration::from_secs(1); //! let status_code = match child.wait_timeout(one_sec).unwrap() { //! Some(status) => status.code(), //! None => { //! // child hasn't exited yet //! child.kill().unwrap(); //! child.wait().unwrap().code() //! } //! }; //! ``` #![deny(missing_docs, warnings)] #![doc(html_root_url = "https://docs.rs/wait-timeout/0.1")] #[cfg(unix)] extern crate libc; use std::io; use std::process::{Child, ExitStatus}; use std::time::Duration; #[cfg(unix)] #[path = "unix.rs"] mod imp; #[cfg(windows)] #[path = "windows.rs"] mod imp; /// Extension methods for the standard `std::process::Child` type. pub trait ChildExt { /// Deprecated, use `wait_timeout` instead. #[doc(hidden)] fn wait_timeout_ms(&mut self, ms: u32) -> io::Result> { self.wait_timeout(Duration::from_millis(ms as u64)) } /// Wait for this child to exit, timing out after the duration `dur` has /// elapsed. /// /// If `Ok(None)` is returned then the timeout period elapsed without the /// child exiting, and if `Ok(Some(..))` is returned then the child exited /// with the specified exit code. fn wait_timeout(&mut self, dur: Duration) -> io::Result>; } impl ChildExt for Child { fn wait_timeout(&mut self, dur: Duration) -> io::Result> { drop(self.stdin.take()); imp::wait_timeout(self, dur) } }