diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-02-06 23:39:40 +0100 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-02-06 23:39:40 +0100 |
commit | 0a241cdcd34b94429100eae258bdb57500617662 (patch) | |
tree | ec84aa1be3336d4eef873f37928a4fb13e45a080 /src | |
parent | 6f446ffc9dd49cac07e6c0096cc512e379a7f3ed (diff) | |
download | rebel-0a241cdcd34b94429100eae258bdb57500617662.tar rebel-0a241cdcd34b94429100eae258bdb57500617662.zip |
runc: spawn new process for each task
Diffstat (limited to 'src')
-rw-r--r-- | src/runner/runc.rs | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/runner/runc.rs b/src/runner/runc.rs index 35ef1f4..789f7f2 100644 --- a/src/runner/runc.rs +++ b/src/runner/runc.rs @@ -4,7 +4,7 @@ mod run; use std::{io, process}; use ipc_channel::ipc; -use nix::unistd; +use nix::{sys::signal, unistd}; use serde::{Deserialize, Serialize}; use crate::types::*; @@ -38,10 +38,20 @@ fn runner( init::runc_initialize().unwrap(); + unsafe { signal::signal(signal::Signal::SIGCHLD, signal::SigHandler::SigIgn) }.unwrap(); + while let Ok(request) = channel.recv() { - let Request(task, task_def, reply_sender) = request; - if let Err(error) = run::handle_task(task, task_def) { - reply_sender.send(error).expect("IPC send() failed"); + match unsafe { unistd::fork() }.expect("fork()") { + unistd::ForkResult::Parent { .. } => {} + unistd::ForkResult::Child => { + unsafe { signal::signal(signal::Signal::SIGCHLD, signal::SigHandler::SigDfl) } + .unwrap(); + + let Request(task, task_def, reply_sender) = request; + if let Err(error) = run::handle_task(task, task_def) { + reply_sender.send(error).expect("IPC send() failed"); + } + } } } |