summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-02-06 23:39:40 +0100
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-02-06 23:39:40 +0100
commit0a241cdcd34b94429100eae258bdb57500617662 (patch)
treeec84aa1be3336d4eef873f37928a4fb13e45a080
parent6f446ffc9dd49cac07e6c0096cc512e379a7f3ed (diff)
downloadrebel-0a241cdcd34b94429100eae258bdb57500617662.tar
rebel-0a241cdcd34b94429100eae258bdb57500617662.zip
runc: spawn new process for each task
-rw-r--r--src/runner/runc.rs18
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");
+ }
+ }
}
}