diff --git a/src/kernel.cr b/src/kernel.cr index b1e94a6e46b5..177313515284 100644 --- a/src/kernel.cr +++ b/src/kernel.cr @@ -433,6 +433,13 @@ class Process ->Random::DEFAULT.new_seed, ] of -> Nil end + + # Hooks that must always run between fork/exec. + def self.after_fork_before_exec_callbacks + @@after_fork_before_exec_callbacks ||= [ + ->Crystal::Signal.after_fork_before_exec, + ] of -> Nil + end end {% unless flag?(:win32) %} diff --git a/src/process.cr b/src/process.cr index d9058dae74d0..a155aa82f915 100644 --- a/src/process.cr +++ b/src/process.cr @@ -121,7 +121,11 @@ class Process case pid when 0 pid = nil - Process.after_fork_child_callbacks.each(&.call) if run_hooks + if run_hooks + Process.after_fork_child_callbacks.each(&.call) + else + Process.after_fork_before_exec_callbacks.each(&.call) + end when -1 raise Errno.new("fork") end diff --git a/src/signal.cr b/src/signal.cr index 186e6b13f003..974f8b7e7be9 100644 --- a/src/signal.cr +++ b/src/signal.cr @@ -191,6 +191,10 @@ module Crystal::Signal @@pipe = IO.pipe(read_blocking: false, write_blocking: true) end + def self.after_fork_before_exec + @@pipe.each(&.close) + end + private def self.reader @@pipe[0] end