exec システム関数の種類と実行例2019年02月08日 14時32分38秒

exec* は現在実行中のプログラムを新しいプログラムで上書きして始める関数。FreeBSD では execve がシステムコールになっていて、その他のものはライブラリコールになっている。その事からも execve が新しいプログラムを実行し始める基礎なのが伺える。

exec 系は、配列を受け取る v 系と引数の羅列を受け取る l 系に別れてる。そして、実行ファイルを PATH に基づいて探すp 系と、環境変数を渡す事ができる e 系に更に別れる。 更に FreeBSD では、実行パスも渡せる P 関数とファイル名の代わりにファイルディスクリプタを渡せる f 関数がある。

  • execl
    • 引数は羅列。 パスを指定。
  • execlp
    • 引数は羅列。 プログラム名を指定。
  • execle
    • 引数は羅列。 パスを指定。 環境変数を渡す。
  • execv
    • 引数は配列。 パスを指定。
  • execvp
    • 引数は配列。 プログラム名を指定。
  • execvP
    • 引数は配列。 プログラム名を指定。 検索パスも指定。 FreeBSD 固有。
  • execve
    • 引数は配列。 パスを指定。 環境変数を渡す。
  • fexecve
    • 引数は配列。 ファイルディスクリプタを指定。 環境変数を渡す。
fexecve は 2008 年に POSIX で規定された新しいシステムコール。ファイルを実行する前に、内容を確認することができる様に規定されたようだ。FreeBSD、Linux、Solaris に AIX と確認したが、これらのシステムでは利用可能だった。

exec の分類が終ったところで、今度は引数の種類。

exec 関数の第一引数は全て新しい実行ファイル。プログラムは、パスを指定かファイル名を指定かに別れるが、ファイルは実際に存在しなければいけない。

環境変数 e 系の exec 関数は最後の引数が環境変数。文字列の配列として渡す。一つ一つの文字列が変数名と値を表すので、等号を挟んだタグ値式で記述される。

そして、exec 関数の第二以降の引数は、新しいプログラムに渡す引数。羅列 l 型の exec 関数は、引数の列の終りを示す NULL を最後に渡す必要がある。配列 v 型の文字列の最後の要素も NULL にする必要がある。l 型も v 型も最初の値は慣習的にプログラム名が入るが、getopt はこの最初の引数・値を飛ばすので、実際に実行するプログラムと違った値が入っていても、exec 関数は問題はない。

exec 関数は実行処理を新しいプログラムに渡してしまうので、成功すると戻って来ない。戻って来るのは新しいプログラムの起動に失敗したときになる。

各関数の使い方の例と共に、argv[0] の動作を見てみてたい。

次回