Обратный вызов вилки в ruby ​​с использованием trap - PullRequest
3 голосов
/ 02 апреля 2012

Я ищу надежный способ реализации обратного вызова для разветвленного процесса, как только он завершится.

Я попытался использовать trap (см. Код ниже), но время от времени кажется, чтовремя.

trap("CLD") {
  pid = Process.wait
  # do stuff
}

pid = fork {
  # do stuff
}

Хотя я нашел (через Google) возможные объяснения, почему это может происходить, мне трудно найти возможное решение.

1 Ответ

2 голосов
/ 02 апреля 2012

Единственное решение, которое я вижу до сих пор, - это открыть канал между процессами (родительский - конец чтения, дочерний - конец записи).Затем поместите поток родительских процессов в блокировку для чтения и перехвата исключений «сломанный канал» или «закрытый канал».

Любое из этих исключений, очевидно, будет означать, что дочерний процесс мертв.

ОБНОВЛЕНИЕ: ЕслиЯ не ошибаюсь, что обычно закрытый канал приведет к 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
...