execve関数は、実行形式のプログラムファイルを実行します。一般的には、fork関数で生成した子プロセスで外部プログラムを実行したいような時に使用します。

この関数は、C言語のライブラリ関数(標準関数)ではありませんので、コンパイラにより、使えない場合があります。

#include <unistd.h>
int execve(const char *filename, char *const argv[], char *const envp[]);

*filenameは実行形式のプログラムファイルのパス名を指定します。
argv[]は実行するプログラムに渡す引数を、char型のポインタの配列として指定します。
envp[]は実行するプログラムの環境変数を、char型のポインタの配列として指定します。伝統的に、key=valueの形式です。
argv[]及び、envp[]の最後の要素はNULLでなければなりません。

処理が成功した場合は戻ってきません。失敗した場合は-1を返します。

第1引数の*filenameで指定したプログラムに、第2引数のargv[]及び、第3引数のenvp[]を渡すには、main関数を次のようにします。

int main(int argc, char *argv[], char *envp[])

次の例題プログラムは、システムが提供しているcatコマンドをexecve関数で実行しています。(「cat -n ファイルパス名」の形式のコマンドとして実行します。)

プログラム 例

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
  char    command[] = '/bin/cat';
  char    *exargv[] = {'cat', '-n', '', NULL};
  char    *exenvp[] = {NULL};
  int     return_code = 0;

  if (argc == 2) {
    /* 実行時引数(パス名)をexecveの引数にする */
    exargv[2] = argv[1];
    if (execve(command, exargv, exenvp) == -1) {
      printf('%sコマンドが実行できませんでした\n', command);
      perror('');
      return_code = 1;
    }
  }
  else {
    printf('実行時引数の数が不当です\n');
    return_code = 2;
  }

  return return_code;
}

例の実行結果

$ cat temp_1.txt
Hello World!!.
Bye.
$
$ ./execve.exe temp_1.txt
     1  Hello World!!.
     2  Bye.
$