Actions
Bug #18911
closedProcess._fork hook point is not called when Process.daemon is used
Description
Hello there! I'm working at Datadog on the ddtrace
gem, and we need to hook into fork operations to make sure that our products work correctly/automatically even in environments that fork.
As part as #17795 a new Process._fork
method was added to allow libraries and frameworks to easily hook into fork operations. I was investigating its use in ddtrace
and noticed the following gap: the Process.daemon
API internally makes use of fork
, but the new hook point is not called for that API.
Testcase:
puts RUBY_DESCRIPTION
module ForkHook
def _fork(*args)
puts " #{Process.pid} Before fork!"
res = super
puts " #{Process.pid} After fork!"
res
end
end
Process.singleton_class.prepend(ForkHook)
puts "#{Process.pid} Regular fork:"
fork { exit }
Process.wait
puts "#{Process.pid} Process.daemon:"
Process.daemon(nil, true)
puts "#{Process.pid} Finishing!"
Testcase output:
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin20]
48136 Regular fork: # <-- original process
48136 Before fork!
48136 After fork! # <-- original process
48137 After fork! # <-- child process
48136 Process.daemon: # <-- original process
48139 Finishing! # <-- forks and pid changes, but the hook isn't called
This was surprising to me since the advantage of this hook point would not not needing to hook into the many other places where fork
can get called from.
Thanks a lot :)
Actions
Like0
Like0Like0Like0Like0Like0Like0Like0Like0