home changes contents help options

219:プロセスをフォークする

os モジュールの fork 関数を用います。フォークに失敗した場合、 OSError? 例外が送出されるようになっています。実際に使用するコードでは、これを捕まえるようにしておいてください。下記のコード例では try 文は省略しています。子プロセスの終了を待つには wait, waitpid 関数を使います。 Python 2.5 以降ならばより多くの情報を返す wait3, wait4 関数もあります。

#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import os
import sys

pid = os.fork()
if pid == 0:
    print 'chiled process'
    sys.exit()
os.wait()
print 'parent process'
print 'child process id: %d' % pid

wait, waitpid 関数の戻り値にはプロセス状態コードが含まれます。これを確認すれば終了した理由を調べることができます。 os モジュールにはそのための関数が用意されています。詳しくはリファレンスを参照してください。

子プロセスにて他のプログラムを実行するという場合、現在のプロセスを別のプロセスで置き換える os.exec* (execl, execv など複数あり)関数を用います。

#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import os
import sys

pid = os.fork()
if pid == 0:
    os.execl('/bin/ls', '-l')
os.wait()
print 'parent process'
print 'child process id: %d' % pid

とはいえ、ただプログラムを立ち上げるだけならば subprocess モジュールで十分であることが多いです。

#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import subprocess

ps = subprocess.Popen(['ls', '-l'])
ps.wait()
print 'parent process'

あえて fork を使い、明示的にプロセスをフォークする機会というのは、複数プロセスを駆使するアプリ(Web サーバなど)の実装やデーモンプロセスの作成などに限られます。

関連情報

221:デーモンになる