diff --git a/lib/childprocess/process_spawn_process.rb b/lib/childprocess/process_spawn_process.rb index 11bd3a6..73041ef 100644 --- a/lib/childprocess/process_spawn_process.rb +++ b/lib/childprocess/process_spawn_process.rb @@ -8,7 +8,7 @@ def exited? return true if @exit_code assert_started - pid, status = ::Process.waitpid2(@pid, ::Process::WNOHANG | ::Process::WUNTRACED) + pid, status = ::Process.waitpid2(@pid, ::Process::WNOHANG) pid = nil if pid == 0 # may happen on jruby log(:pid => pid, :status => status) diff --git a/spec/unix_spec.rb b/spec/unix_spec.rb index fe5b61b..b6cd7e8 100644 --- a/spec/unix_spec.rb +++ b/spec/unix_spec.rb @@ -6,6 +6,21 @@ describe ChildProcess::Unix::Process do it_behaves_like "a platform that provides the child's pid" + it "does not treat a stopped child as exited" do + process = sleeping_ruby.start + Process.kill("STOP", process.pid) + + wait_until do + IO.popen(["ps", "-o", "state=", "-p", process.pid.to_s], &:read).strip.start_with?("T") + end + expect(process).not_to be_exited + + Process.kill("CONT", process.pid) + process.stop + ensure + Process.kill("CONT", process.pid) if process&.alive? + end + it "handles ECHILD race condition where process dies between timeout and KILL" do process = sleeping_ruby