gpt4 book ai didi

ruby - 使用陷阱在 ruby​​ 中 fork 回调

转载 作者:数据小太阳 更新时间:2023-10-29 08:05:28 28 4
gpt4 key购买 nike

我正在寻找一种可靠的方法来在 fork 进程完成后实现回调。

我试过使用 trap(见下面的代码),但它似乎有时会失败。

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

pid = fork {
# do stuff
}

虽然我确实(通过谷歌)找到了可能发生这种情况的可能解释,但我很难找出可能的解决方案。

最佳答案

到目前为止我看到的唯一解决方案是在进程之间打开一个管道(父 - 读端,子 - 写端)。然后将父进程线程置于阻塞读取并捕获“破管”或“管道关闭”异常。

这些异常中的任何一个都显然意味着子进程已死。

更新:如果我没记错的话,正常关闭的管道将导致阻塞读取的 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

关于ruby - 使用陷阱在 ruby​​ 中 fork 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9977382/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com