gpt4 book ai didi

ruby - 作为脚本调用时陷阱不起作用;但适用于 IRB

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

我正在试验多个进程。我正在诱捕 SIGCLD 以在 child 完成后执行某些操作。它在 IRB 上工作,但当我作为 ruby​​ 脚本执行时却没有。

pid = fork {sleep 2; puts 'hello'}
trap('CLD') { puts "pid: #{pid} exited with code"}

当我从 IRB 运行上面的代码时,我会打印两行,但是当我将它作为 ruby​​ 脚本运行时,陷阱过程中的行不会显示。

最佳答案

IRB 为您提供了一个外部循环,这意味着 ruby​​ 进程不会退出,直到您决定终止它。您的 ruby​​ 脚本的问题是主要进程在它有机会捕获信号之前完成并杀死您的 child (哎呀)。

我的猜测是,这是一个测试脚本,您想要的程序很可能不会出现父进程在子进程之前完成的情况。要查看您的陷阱在普通 ruby​​ 脚本中的工作情况,请在末尾添加一个 sleep :

pid = fork {sleep 2; puts 'hello'}
trap('CLD') { puts "pid: #{pid} exited with code"}
sleep 3

要填充 $? 全局变量,您应该显式地等待子进程退出:

pid = fork {sleep 2; puts 'hello'}
trap('CLD') { puts "pid: #{pid} exited with code #{$? >> 8}" }
Process.wait

如果您确实希望子进程在父进程结束后运行,您需要一个守护进程(双叉)。

关于ruby - 作为脚本调用时陷阱不起作用;但适用于 IRB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20466690/

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