はじめに
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[]);
関数名の意味
exec系関数の名前は、execの後が l, v, p, e のどれかが記述されている。
それぞれの意味は以下になる。
l
コマンドの引数を可変長で取る
また、最後は NULL にする必要がある
例)
execl("/bin/ls", "-a", "-l", NULL);
v
コマンドの引数をポインタの配列として取る
また、配列の最初は、ファイル名へのポインタとし、配列の最後は NULL にする必要がある。
例)
char *argv[] = {"/bin/ls", "-a", "-l", NULL};
res = execv(argv[0], argv);
p
指定されたファイル名に /(スラッシュ)が含まれていない場合、シェルと同じ動作で実行可能ファイルを探索する。
例)
execlp("ls", "-a", "-l", NULL); // 関数名にpがついてなければ /bin/ls にしなければならない
e
環境変数を設定することができる。
例)
char *envp[] = {"ENV1=env1", "ENV2=env2",NULL};
execle("/usr/bin/env", "", NULL, envp);
// ENV1=env1
// ENV2=env2
戻り値
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
成功時はここまでこないよ
0件のコメント