execl,execle,execlp,execlpe,execv,execve,execvp,execvpe,_wexecl,_wexecle,_wexeclp,_wexeclpe,_wexecv,_wexecve,_wexecvp,_wexecvpe
process.h:インデックス への移動
ヘッダーファイル
process.h
カテゴリ
プロセス制御ルーチン
プロトタイプ
int execl(char *path, char *arg0 *arg1, ..., *argn, NULL);
int _wexecl(wchar_t *path, wchar_t *arg0 *arg1, ..., *argn, NULL);
int execle(char *path, char *arg0, *arg1, ..., *argn, NULL, char **env);
int _wexecle(wchar_t *path, wchar_t *arg0, *arg1, ..., *argn, NULL, wchar_t **env);
int execlp(char *path, char *arg0,*arg1, ..., *argn, NULL);
int _wexeclp(wchar_t *path, wchar_t *arg0,*arg1, ..., *argn, NULL);
int execlpe(char *path, char *arg0, *arg1, ..., *argn, NULL, char **env);
int _wexeclpe(wchar_t *path, wchar_t *arg0, *arg1, ..., *argn, NULL, wchar_t **env);
int execv(char *path, char *argv[]);
int _wexecv(wchar_t *path, wchar_t *argv[]);
int execve(char *path, char *argv[], char **env);
int _wexecve(wchar_t *path, wchar_t *argv[], wchar_t **env);
int execvp(char *path, char *argv[]);
int _wexecvp(wchar_t *path, wchar_t *argv[]);
int execvpe(char *path, char *argv[], char **env);
int _wexecvpe(wchar_t *path, wchar_t *argv[], wchar_t **env);
説明
ほかのプログラムを読み込んで実行します。
exec... 系の関数は,子プロセスと呼ばれるほかのプログラムを読み込んで実行します。exec... 系関数の呼び出しに成功した場合,子プロセスは親プロセスをオーバーレイします。子プロセスを読み込みおよび実行できるだけの十分なメモリが必要です。
path は,呼び出される子プロセスのファイル名です。exec... 系関数は,標準の検索アルゴリズムを使って次のようにパスを検索します。
- 明示的な拡張子がない場合,関数は,指定されたファイルを検索します。ファイルが見つからない場合は,.EXE を追加して,再度検索を行います。見つからない場合は,.COM を追加して,再度検索を行います。見つかった場合は,コマンドプロセッサ COMSPEC(Windows)または COMMAND.COM(DOS)を使ってバッチファイルを実行します。
- 明示的な拡張子またはピリオドがある場合,関数は,指定されたファイルに正確に一致するファイルを検索します。
exec... 系関数の名前にサフィックス l,v,p,e が付いている場合は,その関数が特定の機能を使用することを示します。
l |
引数ポインタ(arg0,arg1,... argn)が個別の引数として渡されることを指定します。通常,l サフィックスは,渡される引数の個数が事前にわかっている場合に使用されます。 |
v |
引数ポインタ(argv[0] ...,arg[n])がポインタの配列として渡されることを指定します。通常,v サフィックスは,可変個の引数が渡されるときに使用されます。 |
p |
関数が PATH 環境変数で指定されているディレクトリでファイルを検索することを指定します。p サフィックスなしの関数は,現在の作業ディレクトリだけを検索します。path パラメータに明示的なディレクトリが含まれていない場合,関数は,最初に現在のディレクトリを検索し,次に PATH 環境変数で設定されているディレクトリを検索します。 |
e |
引数 env を子プロセスに渡して子プロセスの環境を変更できることを指定します。e サフィックスなしの場合,子プロセスは親プロセスの環境を継承します。 |
exec... 系の関数は,引数指定サフィックス l または v のいずれかを持つ必要があります。パス検索(p)と環境継承(e)のサフィックスは任意です。次に例を示します。
- execl は,引数を個別に受け取り,子プロセスをルートまたは現在のディレクトリでのみ検索し,親プロセスの環境を子プロセスに渡す exec... 系関数です。
- execvpe は,引数ポインタの配列を受け取り,子プロセスの検索で PATH を使用し,子プロセスの環境を変更する env 引数を受け付ける exec... 系関数です。
exec... 系関数は,子プロセスに引数を少なくとも 1 つ(arg0 または argv[0])渡す必要があります。この引数は,慣例として path のコピーです。ただし,この 0 番めの引数に別の値を使用しても,エラーは発生しません。
path は,子プロセスで使用できます。
l サフィックスが使用される場合は,通常,arg0 が path を指し,arg1 ~ argn が新しい引数リストとなる文字列を指します。argn の後には,リストの最後を示す NULL が必要です。
e サフィックスが使用される場合は,引数 env によって新しい環境設定リストを渡します。この環境引数は,文字ポインタの配列です。配列の各要素は,次の形式のヌルで終わる文字列へのポインタです。
envvar = value
ここで,envvar は環境変数の名前,value は envvar に設定する文字列値です。env の最後の要素は NULL です。env が NULL の場合,子プロセスは親プロセスの環境設定を継承します。
arg0 + arg1 + ... + argn(または argv[0] + argv[1] + ... + argn[n])を合わせた長さは,引数を区切る空白文字も含めて,260 バイト未満でなければなりません。ヌルターミネータはカウントされません。
exec... 系関数を呼び出した場合,子プロセスのオープンファイルは開いたままになります。
戻り値
成功した場合,exec... 系関数は戻りません。エラーが発生した場合は -1 を返し,グローバル変数 errno に次のいずれかの値が設定されます。
EACCES |
アクセスが許可されない |
EMFILE |
オープンファイルが多すぎる |
ENOENT |
パスまたはファイル名が見つからない |
ENOEXEC |
実行フォーマットエラー |
ENOMEM |
メモリが不十分 |
例
/* execl() の例 */
#include <stdio.h>
#include <process.h>
int main(int argc, char *argv[])
{
int loop;
printf("%s running...\n\n", argv[0]);
if (argc == 1) { /* 1 つのコマンドラインパラメータだけをチェックします */
printf("%s calling itself again...\n", argv[0]);
execl(argv[0], argv[0], "ONE", "TWO", "THREE", NULL);
perror("EXEC:");
exit(1);
}
printf("%s called with arguments:\n", argv[0]);
for (loop = 1; loop <= argc; loop++)
puts(argv[loop]); /* すべてのコマンドラインパラメータを表示します */
return 0;
}