如何从Ruby的Process.fork()中获取退出代码?

时间:2016-09-13 23:04:28

标签: ruby multithreading macos fork

正如它在锡上所说的

pid = Process.fork do
  exit 25
end
除了告诉我叉子运行的实际系统进程号之外,

pid似乎没用。 Thread会更有用吗?

3 个答案:

答案 0 :(得分:1)

来自fork的手册:

父进程应使用Process.wait收集其子女的终止状态,或使用Process.detach注册对其状态的不感兴趣;否则,操作系统可能会累积僵尸进程。

所以在你的情况下:

status = Process.wait(pid)

线程与多进程模型完全不同。如果您正在编写并行代码,则需要确定最佳方法。

答案 1 :(得分:1)

@tadman 的回答不正确。

Process::wait 返回 pid 而不是状态,参见 https://ruby-doc.org/core-3.0.1/Process.html#wait-method

<块引用>

等待子进程退出,返回其进程ID,并设置$?到包含该进程信息的 Process::Status 对象。

就你而言:

pid = fork{exit 25} #=> 98287
Process.wait(pid)   #=> 98287
$?.class            #=> Process::Status
$?.exitstatus       #=> 25
$?.to_i             #=> 98287
$?.stopped?         #=> false
$?.exited?          #=> true

带螺纹:

pid = fork{ exit 123 }
thread = Process.detach(pid)
thread.join.value            #=> #<Process::Status: pid 99172 exit 123>
thread.join.value.exitstatus #=> 123

答案 2 :(得分:0)

由于我遇到了同样的问题,我最终使用了$?

ruby-doc

中所述
  

$?最后执行的子进程的状态。

你能做的是

pid = Process.fork do
  exit 25
end

Process.wait pid
exit_status = $?