5プロセスプリミティブexeclexeclp execle execv execvp execvp ex



5 Process Primitive Execl Execlp Execle Execv Execvp Execvp Ex



1.exec家族に依存するヘッダーファイル

#include



extern char **おおよそ

関数宣言



//最初のパラメータ:実行可能プログラムの絶対位置

//2番目のパラメーター:実行可能プログラムの実行に必要なパラメーター。これは可変パラメーターです。各パラメーターはコンマで区切られます。

//パラメータの最後にある最後のパラメータは:ヌル



int execl(constchar * path、const char * arg、...)

//ここに関数名が追加されていることに注意してください。p、システム環境変数が呼び出されることを示します道、環境変数コマンドを表示します。エコー$ PATH

//最初のパラメータ:ファイル名を書き込むだけで、フルパスを書き込む必要はありません。次のパラメータは上記のパラメータと同じです。

int execlp(constchar * file、const char * arg、...)

//最初のパラメーター:フルパス

// envp []、環境変数の配列が渡されることを示します

int execle(constchar * path、const char * arg、

...、char * const envp [])

//これと最初のものexec関数間の違いは、ここでの引数は変更可能な引数ではなく、配列を渡すことによって渡されることです。

int execv(constchar * path、char * const argv [])

// execvpexecv違いは、ファイル名とパスの違いだけです。

int execvp(constchar * file、char * const argv [])

//今回は環境変数を渡します

int execvpe(constchar * file、char * const argv []、

char * const envp [])

3.3。注意:

に:これらの関数は、呼び出しが成功した場合はスタートアップコードから新しいプログラムをロードし、戻りません。呼び出しが失敗した場合は戻ります。-1、などexecこの関数にはエラーの戻り値のみがあり、成功した戻り値はありません。

B:これらの関数プロトタイプは簡単に組み合わせることができるようですが、ルールをマスターしている限り、覚えやすいです。文字なしp(表現

)のexec関数の最初の引数は、プログラムの相対パスまたは絶対パスである必要があります。たとえば、 '/ bin / ls'または'./

a.out'ではなく'ls'または'a.out手紙の場合p関数:

パラメータにが含まれている場合/、次にそれをパス名として扱います。

それ以外の場合は、パスのないプログラム名として扱われます。環境変数のディレクトリリストでこのプログラムを検索します。

文字付きl(表現リスト)のexecこの関数では、新しいプログラムの各コマンドライン引数をパラメーターとして扱う必要があります。

コマンドライン引数の数は変更可能であるため、関数プロトタイプの...の最後の変数は次のようになります。

ヌルから歩哨役割。手紙の場合v(表現ベクター)、最初にポインタを作成する必要があります

各引数へのポインタの配列。次に、配列の最初のアドレスをパラメータとして渡します。配列の最後のポインタも

はいヌルと同じようにメイン関数argvパラメータは環境変数テーブルと同じです。

C:ためにです(表現環境の終わりexec関数、あなたはそれに新しい環境変数テーブルを渡すことができます、他execこの関数は、現在の環境変数テーブルを使用して新しいプログラムを実行します。

D:exec呼び出しの例は次のとおりです。

char * const ps_argv [] = {'ps'、 '-o'、 'pid、ppid、pgrp、session、tpgid、comm'、NULL}

char * const ps_envp [] = {'PATH = / bin:/ usr / bin'、 'TERM = console'、NULL}

execl( '/ bin / ps'、 'ps'、 '-o'、 'pid、ppid、pgrp、session、tpgid、comm'、NULL)

execv( '/ bin / ps'、ps_argv)

execle( '/ bin / ps'、 'ps'、 '-o'、 'pid、ppid、pgrp、session、tpgid、comm'、NULL、ps_envp)

execve( '/ bin / ps'、ps_argv、ps_envp)

execlp( 'ps'、 'ps'、 '-o'、 'pid、ppid、pgrp、session、tpgid、comm'、NULL)

execvp( 'ps'、ps_argv)

IS:実際には、実行する実際のシステムコールであり、他の5つの関数は最終的に呼び出されます実行する、など実行するおとこハンドブックセクション、他の機能はおとこハンドブック3セクション。これらの機能の関係を下図に示します。

四。ケースの説明:

演算結果:

5.5。のためexecこの関数にはエラーの戻り値しかありません。戻ってくる限りは間違いなので判断する必要はありません。

後で直接呼び出される戻り値恐怖大丈夫です。呼び出しに注意してくださいexeclp2時が過ぎた 'ps”パラメータ、最初

'ps'はプログラムの名前です、execlpあるべき機能このプログラムを環境変数で見つけて実行し、次に

'ps'は最初のコマンドライン引数です。execlp関数はその値を気にせず、単にそれをに渡すだけですpsチェン

シーケンス、psプログラムは合格できますメイン関数argv [0]このパラメーターを取得します。

転送execその後、元の開いているファイル記述子はまだ開いています。これを使用して達成するI / Oリダイレクト。

簡単な例を見てみましょう。標準入力を大文字に変換し、出力を標準出力に変換します。

演算結果:

演算結果:

分析:

ラッパープログラムは、コマンドライン引数をファイル名として開き、標準入力をこのファイルにリダイレクトしてから、を呼び出します。

exec実施したアッパープログラム、元の開いているファイル記述子がまだ開いているとき、アッパープログラムは、文字を標準入力から大文字に変換することのみを担当し、標準入力がファイルまたは端末のどちらに対応するかは関係ありません。

exec家族

lコマンドライン引数リスト

p探すファイル使用する変数

vコマンドライン引数配列を使用する

です環境変数の配列を使用するプロセスの元の環境変数を使用せずに実行する新しいローダーの環境変数を設定します。

次に、私の先生である神の人工知能チュートリアルを共有します。ゼロベース!わかりやすい!ユーモラス!黄色の段落も!私たちの人工知能チームにもぜひご参加ください。 https://blog.csdn.net/jiangjunshow