子进程为fork调用返回nil

时间:2012-06-22 11:34:58

标签: ruby unix process

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时,这不应该是一种递归类型的呼叫吗?就像..孩子也要求另一个子进程..那个子进程分叉另一个进程..等等,我在这里错过了什么?

2 个答案:

答案 0 :(得分: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

由于大多数情况下,孩子应该做父母过程以外的事情,这段代码更好地反映了意图。

答案 1 :(得分:0)

我猜你错过了一点,我引用了Ruby fork文档,调用一个带有块的fork,执行下面的代码两次,一个用于父级,另一个用于子级(fork进程),带子fork return nil < / strong>

您如果检查输出

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 documentation这种形式的fork声明与@psyho已回答的块事件相比有点混乱。

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

希望这个帮助