0
puts "Process #{Process.pid} started"
return_value = fork
puts "Process #{Process.pid} returned #{return_value}"
puts "Process #{Process.pid} exited"

上面的 ruby​​ 代码将此输出打印到 STDOUT

Process 6644 started
Process 6644 returned 6645
Process 6644 exited
Process 6645 returned 
Process 6645 exited

父进程执行fork时,返回子进程的pid。当子进程调用fork为什么它返回nil时,这不应该是递归调用吗?就像.. child 也分叉了另一个子进程.. 而那个子进程分叉了另一个进程..等等,我在这里遗漏了什么吗?

4

2 回答 2

1

这是您在代码中区分代码是在父进程中还是在子进程中运行的方式:父进程接收分叉子进程的 PID,子进程获得nil.

就个人而言,我更喜欢使用以下语法:

pid = fork do
  # this is the code that will be executed by the child
end

# this is the code executed by parent

由于大多数时候,子进程应该做的不是父进程,所以这段代码更好地反映了意图。

于 2012-06-22T13:37:19.943 回答
0

我想你确实错过了一点,我参考了 Ruby fork 文档,调用带有块的 fork 执行了它下面的代码两次,一次用于父级,另一次用于子级(fork 进程),child fork return nil

你如果你检查你的输出

Process 6644 started  -- Parent Process Started
Process 6644 returned 6645 -- Parent Process displaying the retrun value = child process id
Process 6644 exited   -- Parent Process exiting
Process 6645 returned  -- Child Process forked earlier and since there return value is nil
Process 6645 exited  -- Child Process exiting

检查关于 fork 的 Ruby文档,这种形式的 fork 声明与@psyho 回答的块问题明显混淆。

我建议您使用@psycho 回答的相同声明,因为这很令人困惑

希望这有帮助

于 2012-06-22T18:28:49.533 回答