GNU/Linux >> Linux の 問題 >  >> Linux

exec と execve のようなシステム コールの exec ファミリーの機能の違いは何ですか?

exec はありません システム コール -- これは通常、すべての execXX を参照するために使用されます。 グループとして呼び出します。それらはすべて基本的に同じことを行います。新しいプログラムを現在のプロセスにロードし、引数と環境変数を提供します。違いは、プログラムを見つける方法、引数を指定する方法、および環境がどこから来るかです。

  • v での呼び出し 名前で、argv[] を指定する配列パラメーターを使用します 新しいプログラムの配列。引数の末尾は、NULL を含む配列要素によって示されます。 .

  • l での呼び出し 名前には、新しいプログラムの引数を、関数自体への可変長引数リストとして使用します。引数の最後は (char *)NULL で示されます 口論。 NULL であるため、常に型キャストを含める必要があります。 は整数定数にすることができ、可変引数関数を呼び出すときのデフォルトの引数変換はそれをポインターに変換しません。

  • e での呼び出し 名前に追加の引数を取ります (または l の引数 ケース) 新しいプログラムの環境を提供するため。それ以外の場合、プログラムは現在のプロセスの環境を継承します。これは argv と同じ方法で提供されます array:execve() の配列 、execle() の個別の引数 .

  • p の呼び出し 名前で PATH を検索します プログラムにディレクトリがない場合 (つまり、/ が含まれていない場合) にプログラムを見つけるための環境変数 キャラクター)。それ以外の場合、プログラム名は常に実行可能ファイルへのパスとして扱われます。

  • FreeBSD 5.2 は別の変種を追加しました:execvP (大文字の P を使用) )。これは execvp() のようなものです 、ただし、PATH から検索パスを取得する代わりに 環境変数、それは関数への明示的なパラメータです:

int execvP(const char *file, const char *search_path, char *const argv[]);

man exec を使用 そして読む:

The execv(), execvp(), and execvpe() functions provide an array of pointers to 
null-terminated strings that represent the argument list available to the new program. 
The first argument, by convention, should point to the filename associated with the file 
being executed. The array of pointers must be terminated by a NULL pointer. 

execv

int execv(const char *path, char *const argv[]);

したがって、配列をパラメーターとして渡します

int execle(const char *path, const char *arg,
              ..., char * const envp[]);

ほとんど同じですが、配列としてではなく、値 (文字列) のリストの後に環境を指定する配列が続きます。

ここ:

int execvp(const char *file, char *const argv[]);

パスなしでファイルを呼び出しているため、すでに適切な path にいることが期待されます 電話する前に。

最後に重要なこと:

int execve(const char *filename, char *const argv[],
                  char *const envp[]);

前のものと似ていますが、引数と環境変数用に 2 つの配列があります。


これらの関数はすべて exec() ファミリーに属しているため、differentiate とさせてください。 extra charactersによると 意味とともに、

1.execve ():

p :存在しない => 実行するプログラムの名前は pathname から取得されます

v :present => 引数は array として渡されます

e :present => 環境は envp argument から取得されます

2.execファイル ():

p :存在しない => 実行するプログラムの名前は pathname から取得されます

l :present => 引数は list として渡されます

e :present => 環境は envp argument から取得されます

3.execlp ():

p :present => 実行するプログラムの名前は filename から取得されます 指定しないと、システムが search for program file します PATH で 変数。

l :present => 引数は list として渡されます

e :存在しない => 環境は caller's environ から取得されます

4.execvp ():

p :present => 実行するプログラムの名前は filename から取得されます 指定しないとシステムが search for program file します PATH で 変数。

v :present => 引数は array として渡されます

e :存在しない => 環境は caller's environ から取得されます

5.execv ():

p :存在しない => 実行するプログラムの名前は pathname から取得されます

v :present => 引数は array として渡されます

e :存在しない => 環境は caller's environ から取得されます

6.execl ():

p :存在しない => 実行するプログラムの名前は pathname から取得されます

l :present => 引数は list として渡されます

e :存在しない => 環境は caller's environ から取得されます


Linux
  1. fsck と e2fsck の違いは何ですか?

  2. procfs と sysfs の違いは何ですか?

  3. ls と l はどう違いますか?

  1. カーネルでのありそうな呼び出しとありそうもない呼び出しの違いは何ですか?

  2. $(CC) と $CC の違いは何ですか?

  3. unlink と rm の違いは何ですか?

  1. InnoDBとMyISAMの違いは何ですか?

  2. Cのstrtok_rとstrtok_sの違いは何ですか?

  3. ルートとIPルートの違いは何ですか?