ゾンビでもわかるC言語プログラミング

C言語入門者の応援をします

[C言語] exec系関数を使用してシェルコマンドを実行する

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
成功時はここまでこないよ