今回は、Pythonのfork()メソッドが呼び出されたプロセスを使って子プロセスを作成する方法について説明します。
システムコールとは何ですか?
システムコールは、カーネルモードにアクセスするために使用されます。
システムコールは、プログラムがオペレーティングシステムと対話し、指定されたタスクを実行するためのサービスを要求するための方法です。
したがって、すべてのシステムコールはカーネル(特権)モードで実行され、実行が完了すると制御はユーザーモードに戻されます。
また、システムコールを省略してシステムコールと呼ぶこともある。
現代のコンピュータシステムでは、一般にユーザーモードとカーネルモードの2つの動作モードがある。
すべてのユーザープログラムやプロセスはユーザーモードで実行され、カーネルモードに直接アクセスすることはできません。
これは、ユーザープログラムによる修正や変更からオペレーティングシステムを保護するために行われます。
ユーザープログラムが特権的な作業を行う必要がある場合、それはシステムコールを介してのみ得ることができるオペレーティングシステムのサポートが必要です。
そして、API(Application Program Interface)を介して、オペレーティングシステムの様々なサービスをユーザープログラムやプロセスに提供するのがシステムコールです。
Python の fork() とは何ですか?
オペレーティングシステムが提供するさまざまな種類のサービスを管理するために、複数のシステムコールがあります。
また、これらはオペレーティングシステムによって異なります。
システムコールは大きく分けて5つに分類されます。
-
- ファイル関連システムコール
- デバイス関連システムコール
- プロセス関連システムコール
- 情報関連システムコール
- 通信関連システムコール
Pythonの fork()
はプロセス関連システムコールまたはプロセス制御システムコールの一例です。
これは、呼び出したプロセスの子プロセスを、呼び出したプロセスのクローンのように生成するために使われるメソッドです。
fork()` 文を使用してシステムコールを行うプロセスを親プロセスと呼びます。
OSモジュールのインポート
Python で fork()
システムコールを使用して実装するには、Python の os
モジュールが必要です。
このPythonのosモジュールを使うと、オペレーティングシステムに依存した様々な機能を利用することができます。
これにより、ユーザープログラムは、Pythonが動作しているオペレーティングシステムの機能にアクセスできるようになります。
osモジュールはPythonの標準ユーティリティモジュールに含まれ、Pythonがシステムにインストールされると同時にインストールされるため、インストールする必要はありません。
プログラム内部では、以下のようにしてインポートします。
import os
|
Python の fork() の動作
以下は fork()
メソッド/ステートメント の主な特性です。
- プログラム内部で呼び出される場合、引数やパラメータを受け取りません。
- 子プロセスの生成に成功した場合、親プロセスと子プロセスの両方が
fork()
ステートメントに続く次のステートメント/命令を実行します。 - 子プロセスの数 = 2N – 1; ここで、N = メインプログラム内で使用される
fork()
文の数です。
Pythonのfork()文が実行されると、3種類の整数が返されます。
-
- 子プロセスの作成に成功した場合、子プロセスに 0 が返されます。
-
- 子プロセスが正常に生成された場合、親プロセスに正の値(+ve)が返されます。この正の値は、通常新しく作成された子プロセスのプロセスIDであるPIDです。
-
- 何らかの理由で子プロセスの作成にエラーが発生した場合、負の値(-ve)が親プロセスに返されま す。
プロセスIDは通常PIDと呼ばれ、コンピュータシステム内に存在するすべてのプロセスに関連する一意の識別子です。
任意のプロセスのプロセスIDには、情報関連のシステムコールの一例である getpid()
を使ってアクセスすることができる。
getpid()`文は、それを呼び出したプロセスのプロセスIDを返す。
プログラム内部では、以下のように呼び出される。
os.fork() |
この記事もチェック:Pythonのmapメソッドの使い方|ラムダ関数や引数が複数の場合の使い方も解説
Python の fork() メソッドで子プロセスを作成する
例 1:
# Importing os module import os
# Creating child processes using fork() method os.fork() os.fork() # This will be executed by both parent & child processes print ( "Python" )
|
結果は以下の通りです。
# Importing os module import os
# Creating a child process using fork() method val = os.fork()
# Testing the values returned by fork() method if val = = 0 :
pid = os.getpid()
print (f "Hi I am Child Process and my PID is {pid}." )
elif val > 0 :
pid = os.getpid()
print (f "Hi I am Parent Process and my PID is {pid} and PID {val} is my Child Process." )
else :
print ( "Sorry!! Child Process creation has failed..." )
|
上記の Python プログラムは、プログラム内で 2 つの fork()
ステートメントが使用されているため、正しい出力を生成しています。
したがって、print()
文は3つの子プロセスによって4回 (3 + 1) 3回 (22 -1 = 3) 、親プロセスによって1回実行されました。
例2:
結果は、以下の通りになります。
上記の Python プログラムは正しい出力を生成し、 fork()
ステートメントが返す値を明確に示しました。
まとめ
この記事では、システムコールとは何か、Python の fork()
メソッドとは何か、そのプロパティ、そして Python の fork()
メソッドを使って子プロセスを作成する方法について学びました。
Note: fork()
メソッド/システムコールは Linux/Unix オペレーティングシステムでのみ利用可能です。
もし、Windowsシステム上で fork()
メソッドを呼び出すPythonプログラムを実行しようとすると、以下のエラーが発生します。