module function Kernel.#fork

fork -> Integer | nil[permalink][rdoc][edit]
fork { ... } -> Integer | nil

fork(2) システムコールを使ってプロセスの複製を作ります。親プロセスでは子プロセスのプロセスIDを、子プロセスでは nil を返します。ブロックを指定して呼び出した場合には、生成した子プロセスでブロックを評価します。

fork 前に STDOUT と STDERR を IO#flush します。

[EXCEPTION] NotImplementedError:
実行環境がこのメソッドに対応していないとき発生します。
ブロックを指定しなかった場合

if child_pid = fork
  puts "parent process. pid: #{Process.pid}, child pid: #{child_pid}"
  # => parent process. pid: 81060, child pid: 81329

  # 親プロセスでの処理
  # ...

  # 子プロセスの終了を待って終了。
  Process.waitpid(child_pid)
else
  puts "child process. pid: #{Process.pid}"
  # => child process. pid: 81329

  # 子プロセスでの処理
  sleep(1)
end
ブロックを指定した場合

child_pid = fork do
  puts "child process. pid: #{Process.pid}"
  # => child process. pid: 79602

  # 子プロセスでの処理
  sleep(1)
end

puts "parent process. pid: #{Process.pid}, child pid: #{child_pid}"
# => parent process. pid: 79055, child pid: 79602

# 親プロセスでの処理
# ...

# 子プロセスの終了を待って終了。
Process.waitpid(child_pid)

[SEE_ALSO] IO.popen,IO.pipe,Kernel.#at_exit,Kernel.#exit!, fork(2)