summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-10-22 22:40:45 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-10-22 22:40:45 +0200
commit8613e80fcdaeafe6894253f07045b7adbb6c699e (patch)
treecd76f26b0467cfc3fe281c69a12f7a6f50079ef7
parenta035b7ac1985d94a35d1ebbe0f17c651595f118d (diff)
downloadrebel-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.rs16
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);
}