From 0528a6af22c9b5641dcbe0c4991a7a65b5768479 Mon Sep 17 00:00:00 2001 From: Elnath Date: Fri, 18 Apr 2025 18:23:10 +0200 Subject: [PATCH] Program forks and parent waits for child --- src/main.rs | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 0687f85..5d8c7e2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,39 @@ -use nix::unistd::execv; +use nix::unistd::{execv, fork, ForkResult}; use std::ffi::CString; +use std::process::ExitCode; +use nix::sys::wait::{waitid, WaitPidFlag, WaitStatus}; -fn main() { - println!("I am executing {}!", env!("TEST_PROG_PATH")); +fn main() -> ExitCode { + let child_exec_path = CString::new(env!("TEST_PROG_PATH")).unwrap(); - let path = CString::new(env!("TEST_PROG_PATH")).unwrap(); - execv(&path, &[&path]).unwrap(); + match unsafe{fork()} { + Ok(ForkResult::Child) => { + // ⚠️ There is a limited amount of things that can be done here, see fork's safety + execv(&child_exec_path, &[&child_exec_path]).unwrap(); + unreachable!(); + } + Ok(ForkResult::Parent { child: child_pid }) => { + println!("✔️ Started child {child_pid}"); + println!("⏳️ Waiting for child to exit..."); + use nix::sys::wait::Id::Pid; + match waitid(Pid(child_pid), WaitPidFlag::WEXITED) { + Err(e) => { + println!("❌ Wait failed: {e}"); + ExitCode::FAILURE + } + Ok(WaitStatus::Exited(_pid, exit_code)) => { + println!("👋 child exited with code {exit_code}"); + ExitCode::SUCCESS + } + Ok(status) => { + println!("⚠️ Unexpected status from wait! {status:#?}"); + ExitCode::FAILURE + } + } + } + Err(e) => { + println!("❌ Fork failed: {e}"); + ExitCode::FAILURE + } + } }