コンピューティングにおけるスポーンは、新しい子プロセスをロードして実行する関数を指します。現在のプロセスは、子プロセスが終了するまで待機するか、並行コンピューティングの実行を継続します。新しいサブプロセスを作成するには、子プロセスと現在のプログラムの両方が実行できる十分なメモリが必要です。
DOSには、 Microsoft Windowsに継承されたspawn 関数のファミリがあります。
POSIX標準のオプション拡張には、別のspawn関数ファミリも存在します。[1]
DOS/Windows スポーン関数
DOS/Windowsのspawn関数はUnix関数のforkとexecにヒントを得ていますが、これらのオペレーティングシステムはforkをサポートしていないため、[2] spawn関数はfork-execの組み合わせの代わりとして提供されました。しかし、spawn関数は、最も一般的な使用例を適切に処理しますが、fork後にexecを生き残るプロセス設定が変更される可能性があるため、fork-execの完全な機能を備えていません。ただし、ほとんどの場合、この欠陥は、より低レベルのCreateProcess APIを使用することで補うことができます。
spawnl、spawnlp、spawnv、およびspawnvp呼び出しでは、子プロセスは親の環境を継承します。spawn呼び出しが行われたときに開いているファイルは、子プロセスでも開いたままになります。
プロトタイプ
int spawnl(int mode, char *path, char *arg0, ...);int spawnle(int mode, char *path, char *arg0, ..., char ** envp);int spawnlp(int mode, char *path, char *arg0, ...);int spawnlpe(int mode, char *path, char *arg0, ..., char ** envp);int spawnv(int mode, char *path, char **argv);int spawnve(int mode, char *path, char **argv, char ** envp);int spawnvp(int mode, char *path, char **argv);int spawnvpe(int mode, char *path, char **argv, char ** envp);
関数名
各関数の基本名はspawnで、その後に 1 つ以上の文字が続きます。
モード
mode引数は子の実行方法を決定します。mode の値は次のとおりです。
パス
パス引数は、実行するプログラムのファイル名を指定します。spawnlpおよびspawnvpの場合のみ、ファイル名にパスがなく、現在のディレクトリにない場合は、PATH環境変数によってファイルを検索するディレクトリが決定されます。argv [0] が指す文字列は、実行するプログラムの名前です。
生成されたプログラムに渡されるコマンドラインは、spawn呼び出し内の文字列arg0からargnまでで構成されます。これらの文字列の合計許容最大長はコンパイラによって異なり、Digital Mars [3]の128文字からMicrosoft Visual C++ [4]の1024文字、またはDJGPP [5]のメモリが許す限りの長さまでです。argnの後の最後の引数はNULLポインタである必要があります。
引数
argv引数は文字ポインターの配列です。配列の最後のポインターはリストの終わりを示すために null である必要があります 。
環境
spawnle 、spawnlpe、spawnve、およびspawnvpe呼び出しを使用すると、ユーザーはenvp引数で環境設定のリストを渡すことによって、子プロセスの環境を変更できます。この引数は文字ポインターの配列です。各ポインター (最後のポインターを除く) は、環境変数を定義する NULL で終了する文字列を指します。環境変数の形式は次のとおりです。
名前=値
ここで、nameは変数名、valueはその値です。配列の最後のポインターは null です。envp引数が null の場合、子は親の環境設定を継承します。
Microsoft Windows では、spawn*関数は LoadModule を使用して生成されたプロセスを実行します。これが失敗すると、通常の MS-DOS プロセスの生成が試行されます。Windows アプリケーションが生成された場合、インスタンス ハンドルはexec_instancehandleget を使用して取得できます。 _exec_showset、_exec_showget、および_exec_showreset関数を使用して、生成されたプログラムの表示方法を指定できます。
戻り値
戻り値は、生成されたプログラムの終了ステータスを示します。値が 0 の場合、生成されたプログラムが正常に実行されたことを示します。正の値は、生成されたプログラムが実行されたが、中止されたかエラーで終了したことを示し、返される値は子プロセスの終了ステータスです。負の値は、生成されたプログラムが実行されなかったことを示し、errno が設定されます。Microsoft Windows では、spawn は、 C ランタイム ライブラリとの互換性のために LoadModule から返された否定エラー コードを返します。次のエラー コードが発生する可能性があります。
POSIX スポーン関数
およびその兄弟である は、fork および execposix_spawnpの代わりとして使用できますが、と を別々に使用する場合と同じ柔軟性は提供されません。 これらはとの効率的な代わりとなる可能性がありますが、その目的は、動的アドレス変換がないため がサポートされていない組み込み環境でプロセス作成プリミティブを提供することです。
forkexecforkexecfork
歴史
spawnのメタファー、つまり卵の産卵のように子孫を残すことは、VMS (現在のOpenVMS ) オペレーティング システム (1977 年) で初期に使用されました。学界では、Unix フォーク(メモリ レイアウトの粗雑なコピーですが高速) と VMS のspawn (プロセス パラメータの信頼性の高い構築ですが低速) の支持者の間で活発な議論がありました。この議論は、VMS の spawn メカニズムがWindows NT (1993 年)に継承されたときに再燃しました。
参照
参考文献
- ^ Posix.1-2008 スポーン.h
- ^ Windows Subsystem for Linux はfork を実装します。Cygwin などの他の POSIX 環境には実装があるかもしれませんが、POSIX と Windows のプロセス モデルの違いにより、それを使用することは推奨されません。fork はWindows APIの一部ではなく、ほとんどの Windows プログラムはこれらの環境を使用しないため、fork にアクセスできません。
- ^ デジタル火星プロセス.h
- ^ マイクロソフト MSDN
- ^ DJGPP スポーン*
