Единственное решение, которое я вижу до сих пор, - это открыть канал между процессами (родительский - конец чтения, дочерний - конец записи).Затем поместите поток родительских процессов в блокировку для чтения и перехвата исключений «сломанный канал» или «закрытый канал».
Любое из этих исключений, очевидно, будет означать, что дочерний процесс мертв.
ОБНОВЛЕНИЕ: ЕслиЯ не ошибаюсь, что обычно закрытый канал приведет к EOF-результату блокировки чтения, а разрыв канала (если произошел сбой дочернего процесса) приведет к исключению Errno::EPIPE
.
#Openning a pipe
p_read, p_write = IO.pipe
pid = fork {
#We are only "using" write end here, thus closing read end in child process
#and let the write end hang open in the process
p_read.close
}
#We are only reading in parent, thus closing write end here
p_write.close
Thread.new {
begin
p_write.read
#Should never get here
rescue EOFError
#Child normally closed its write end
#do stuff
rescue Errno::EPIPE
#Chiled didn't normally close its write end
#do stuff (maybe the same stuff as in EOFError handling)
end
#Should never get here
}
#Do stuff in parents main thread