diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-22 22:40:45 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-22 22:40:45 +0200 |
commit | 8613e80fcdaeafe6894253f07045b7adbb6c699e (patch) | |
tree | cd76f26b0467cfc3fe281c69a12f7a6f50079ef7 | |
parent | a035b7ac1985d94a35d1ebbe0f17c651595f118d (diff) | |
download | rebel-8613e80fcdaeafe6894253f07045b7adbb6c699e.tar rebel-8613e80fcdaeafe6894253f07045b7adbb6c699e.zip |
container: add additional child process for task submission handling
The parent process will be used for process reaping and signal handling.
-rw-r--r-- | src/runner/container/mod.rs | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/runner/container/mod.rs b/src/runner/container/mod.rs index 2b00791..a839ae2 100644 --- a/src/runner/container/mod.rs +++ b/src/runner/container/mod.rs @@ -9,7 +9,7 @@ use capctl::prctl; use ipc_channel::ipc; use nix::{ sched::CloneFlags, - sys::{signal, stat}, + sys::{signal, stat, wait}, unistd::{self, Gid, Uid}, }; use serde::{Deserialize, Serialize}; @@ -64,9 +64,19 @@ fn runner(uid: Uid, gid: Gid, channel: ipc::IpcReceiver<Message>) -> ! { init::init_runner().unwrap(); - unsafe { signal::signal(signal::Signal::SIGCHLD, signal::SigHandler::SigIgn) }.unwrap(); + let msg_handler = match unsafe { unistd::fork() }.expect("fork()") { + unistd::ForkResult::Parent { child } => { + drop(channel); + child + } + unistd::ForkResult::Child => { + unsafe { signal::signal(signal::Signal::SIGCHLD, signal::SigHandler::SigIgn) }.unwrap(); + runner_loop(channel); + process::exit(0); + } + }; - runner_loop(channel); + wait::waitpid(msg_handler, None).expect("waitpid()"); process::exit(0); } |