コンピューティングにおいて、exec はオペレーティングシステムの機能であり、既存のプロセスのコンテキストで実行可能ファイルを実行し、以前の実行可能ファイルを置き換えます。この動作はオーバーレイとも呼ばれます。これはUnix 系システムで特に重要ですが、他のシステムでも存在します。新しいプロセスは生成されないため、プロセス識別子(PID) は変更されませんが、プロセスのマシンコード、データ、ヒープ、スタックは新しいプログラムのものに置き換えられます。
呼び出しまたはその派生は、コンパイル言語や一部のスクリプト言語を含む多くのプログラミング言語exec()で利用可能です。コマンドインタープリタでは、組み込みコマンドはシェルプロセスを指定されたプログラムに置き換えます。[1]exec
のインターフェースとその実装は多岐にわたります。プログラミング言語execによっては、 1つ以上の関数を介してアクセスできる場合があり、オペレーティングシステムによっては、1つ以上の実際のシステムコールで表現される場合があります。このため、は関数の集合として記述されることもあります。
exec
Cには、単一の単純な関数は存在しませんexec()。
高水準プログラミング言語では通常、 という呼び出しが 1 つ提供されますexec()。[要出典]
POSIX標準では、 unistd.hexecヘッダーファイルで一連の関数が宣言されています。DOS (下記参照)、OS/2、Microsoft Windowsでは、 process.hで同じ関数が宣言されています。
int execl ( char const * path , char const * arg0 , ...); int execle ( char const * path , char const * arg0 , ..., char const * envp []); int execlp ( char const * file , char const * arg0 , ...); int execv ( char const * path , char const * argv []); int execve ( char const * path , char const * argv [], char const * envp []); int execvp ( char const * file , char const * argv []); int execvpe ( const char * file , char * const argv [], char * const envp []); int fexecve ( int fd , char * const argv [], char * const envp []);
いくつかの実装では、これらの関数の名前の先頭にアンダースコアを付けて提供しています(例:_execl)。[2]
それぞれのベースはexecで、その後に 1 つ以上の文字が続きます。
name=value。配列の最終要素はヌルポインタでなければなりません。[3]環境変数を渡すことができない関数 ( execl()、、、)では、新しいプロセス イメージは現在の環境変数を継承します
execlp()。execv()execvp()
最初の引数はarg0実行ファイルの名前であることが多く、引数と同じ値になることもありますpath。ただし、これは単なる慣例であり、この動作が保証されているわけではなく、標準化もされていません。例えば、Javaでは、最初の引数は実行ファイルへのパスではなく、プログラムの最初の引数です。[5]
呼び出し時にオープンされているファイル記述子は、fcntl()が で呼び出されたか、 でオープンされたexec()場合を除き、新しいプロセスイメージでもオープンされたままになります(後者はPOSIX.1-2001で導入されました)。このアスペクトは、新しいプログラムの
標準ストリームを指定するために使用されます。FD_CLOEXECO_CLOEXEC
オーバーレイが成功すると、プロセスの以前のメモリアドレス空間は破壊されます。共有されなかったすべてのメモリ領域はオペレーティングシステムによって再利用されます。その結果、新しいプログラムに渡されなかった、あるいは保存されなかったすべてのデータは失われます。
呼び出しが成功すると、現在のプロセスイメージが置き換えられるため、呼び出し元のプログラムには何も返されません。プロセスには終了ステータスがありますが、その値は親プロセスによって収集されます。
呼び出しが失敗した場合、戻り値は常に となり-1、errnoは適切な値に設定されます。[6]
DOSはマルチタスクオペレーティングシステムではありませんが、主記憶の厳しい制限と仮想記憶の不足により、以前の実行イメージの置き換えは不可欠です。DOSではプログラムのオーバーレイに同じAPIが使用されており、POSIXシステムと同様の効果があります。
MS-DOS exec()関数は、プログラムの実行ファイルヘッダーの「最大割り当て」がデフォルト値の0xFFFFに設定されているかのように、常に新しいプログラムをメモリにロードします。EXEHDRユーティリティを使用すると、プログラムの最大割り当てフィールドを変更できます。ただし、この変更を行った後、プログラムをexec()関数のいずれかで起動すると、オペレーティングシステムのコマンドラインから直接起動した場合や、関数のいずれかで起動した場合とは異なる動作をする可能性がありますspawn()(下記参照)。
多くのUnixシェルexecには、シェルプロセスを指定されたプログラムに置き換える組み込みコマンドも用意されています。 [1] [7] ラッパースクリプトでは、環境変数やその他の設定を行った後、このコマンドを使用してプログラムを(直接、またはインタープリタや仮想マシンを介して)実行することがよく行われます。 を使用することでexec、シェルプログラムが使用するリソースは、プログラムの起動後も使用され続ける必要がなくなります。[8]
このコマンドはリダイレクトも実行できます。シェルによっては、実際のオーバーレイを作成せずにリダイレクトのみに使用することもできます。
OS/360および後継機種にXCTLはexecと同様の機能を実行するシステムコール(転送制御)が含まれています。 [9]
従来のUnixnewシステムには、新しい実行可能プログラムを実行するプロセスをワンステップで作成する機能がありません。他のシステムでは、実行可能ファイルを実行するための主なツールとしてspawnを使用する場合があります。spawnの結果は、Unix系システムのfork-execシーケンスと同等です。POSIXは、オプションの拡張機能としてposix_spawnルーチンをサポートしています。[10]