Index
1. はじめに
exec系関数を使用することで、シェルコマンドを実行することができる。
exec系関数には、以下の6種類が存在する。
#include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg, ..., char * const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execvpe(const char *file, char *const argv[], char *const envp[]);
2. 関数名の意味
exec系関数の名前は、execの後が l, v, p, e のどれかが記述されている。
それぞれの意味は以下になる。
2.1 l
コマンドの引数を可変長で取る
また、最後は NULL にする必要がある
例)
execl("/bin/ls", "-a", "-l", NULL);
2.2 v
コマンドの引数をポインタの配列として取る
また、配列の最初は、ファイル名へのポインタとし、配列の最後は NULL にする必要がある。
例)
char *argv[] = {"/bin/ls", "-a", "-l", NULL}; res = execv(argv[0], argv);
2.3 p
指定されたファイル名に /(スラッシュ)が含まれていない場合、シェルと同じ動作で実行可能ファイルを探索する。
例)
execlp("ls", "-a", "-l", NULL); // 関数名にpがついてなければ /bin/ls にしなければならない
2.4 e
環境変数を設定することができる。
例)
char *envp[] = {"ENV1=env1", "ENV2=env2",NULL}; execle("/usr/bin/env", "", NULL, envp); // ENV1=env1 // ENV2=env2
3. 戻り値
exec系関数は、エラーが発生した時のみ復帰し、戻り値は -1 を返す。
#include <stdio.h> #include <unistd.h> int main() { execl("/bin/uname", "", NULL); printf("成功時はここまでこないよ\n"); return 0; }
% ./a.out Linux
例えば、実在しないコマンドを記述した場合は以下になる。
#include <stdio.h> #include <unistd.h> int main() { int res; res = execl("実在しないコマンド", "", NULL); printf("%d\n", res); printf("成功時はここまでこないよ\n"); return 0; }
% ./a.out -1 成功時はここまでこないよ