Skip to main content

wait_parent/
lib.rs

1use std::process::ExitStatus;
2
3#[cfg(feature = "debug")]
4#[doc(hidden)]
5#[allow(unused)]
6macro_rules! sysinfo_debug {
7    ($($x:tt)*) => {{
8        eprintln!($($x)*);
9    }}
10}
11
12#[cfg(not(feature = "debug"))]
13#[doc(hidden)]
14#[allow(unused)]
15macro_rules! sysinfo_debug {
16    ($($x:tt)*) => {{}};
17}
18
19/// Wait for the parent process to exit.
20///
21/// ## Returns
22/// - `None` if the parent process has already exited
23pub fn wait_parent() -> Option<ExitStatus> {
24    let mut system = sysinfo::System::new();
25    let current_pid = sysinfo::get_current_pid().unwrap();
26    system.refresh_processes_specifics(
27        sysinfo::ProcessesToUpdate::Some(&[current_pid]),
28        false,
29        sysinfo::ProcessRefreshKind::nothing(),
30    );
31    let parent_pid = system.process(current_pid).unwrap().parent().unwrap();
32    sysinfo_debug!("parent_pid: {:?}", parent_pid);
33    system.refresh_processes_specifics(
34        sysinfo::ProcessesToUpdate::Some(&[parent_pid]),
35        false,
36        sysinfo::ProcessRefreshKind::nothing(),
37    );
38    match system.process(parent_pid) {
39        Some(parent) => parent.wait(),
40        None => {
41            sysinfo_debug!("parent process not found: {:?}", parent_pid);
42            None
43        }
44    }
45}
46
47#[cfg(test)]
48mod tests {
49    use super::*;
50}