kazmax - Linux で自宅サーバー

exec - ライブラリコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 返り値
  5. ファイル
  6. エラー
  7. 関連項目
  8. 互換性
  9. 準拠

名前

execl, execlp, execle, execv, execvp - ファイルを実行する

書式

#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 []);

説明

exec ()ファミリーの関数は現在のプロセスイメージを新しいプロセスイメージで置き 換える。このマニュアルで説明されている関数は   execve (2) のフロントエンドである。 (現在のプロセスの置き換えについての詳細は execve ()のマニュアルを参照)

これらの関数の最初の引き数は、実行されるファイルのパス名である。

関数 execl (), execlp (), execle ()の "const char *arg" とそれに続く省略部分は arg0 , arg1 ,..., argn とみなされる。 これらには、実行されるプログラムで利用可能な引き数のリストを指定する (引き数のリストは NULL で終端された文字列へのポインタから構成される)。 慣習として、最初の引き数は、実行されるファイル名 へのポインタにする。引き数のリストは必ず NULL で終わらなければならず、これらの関数は可変長引き数関数なので、 このポインタは "(char *) NULL" とキャストしなければならない。

関数 execv ()と execvp ()は、利用可能な引き数リスト (NULL で終端された文字列への ポインタの配列) を新しいプログラムに渡す。 慣習として、最初の引き数は実行されるファイル名へ のポインタにする。ポインタの配列は必ず NULL で終わらなければならない。

関数 execle ()では新しいプロセスの環境も指定する。 環境は引き数リスト (パラメータリストもしくは追加のパラメータ を持った argv 配列へのポインタ) の最後の NULL ポインタに続けて指定する。 追加のパラメータは、 NULL で終端された文字列へのポインタの配列であり、 NULL ポインタで終わらなければならない。 他の関数では、現在のプロセスの外部変数 environ から新しいプロセス用の環境を与える。

これらの関数のいくつかには特別な動作がある。

関数 execlp ()と execvp ()は、指定されたファイル名がスラッシュ (/) を含んでいない場合、 シェルと同じ動作で実行可能なファイルを探索する。 検索パスは環境変数 PATH で指定されたパスである。 この変数が指定されていない場合、デフォルトPATHとして ``:/bin:/usr/bin'' が使用される。 また、いくつかのエラーが発生した場合の扱いが特殊である。

もしファイルが実行ファイルでない場合 (このとき呼び出そうとした execve ()は EACCES を返す)、これらの関数は残りの検索パスの検索を続ける。 他にファイルが見つからなくなった場合グローバル変数 errnoEACCES を設定し復帰する。

ファイルのヘッダが実行形式として認識できない場合 (このとき呼び出そうとした execve ()は ENOEXEC を返す)、これらの関数はそのファイルを最初の引き数としたシェル を実行する (これにも失敗した場合、これ以上の検索は行われない)。

返り値

もし exec ()ファミリーが復帰してきた場合、エラーが発生している。 返り値は -1 で、大域変数 errno にそのエラーの内容がセットされる。

ファイル

/bin/sh

エラー

これら全ての関数は失敗する場合がある。その場合ライブラリ関数   execve (2) によって指定されたエラーを errno に設定する。

関連項目

互換性

Linux 以外のシステムには、 (環境変数 PATH が定義されていないときの) デフォルトのパスにおいて、カレント・ディレクトリが /bin/usr/bin の後ろに配置されるものもある。 これはトロイの木馬対策のためである。 Linux では、デフォルトのパスに、昔ながらの「現在のディレクトリを 先に探索」というルールを使っている。

ファイルを実行しようとしている間にエラーが発生した時の execlp ()と execvp ()のふるまいについて歴史的な慣習はあるが、伝統的に文書として記載されておらず、 POSIX 標準でも規定されていない。BSD (またおそらく他のシステム) では、 ETXTBSY が発生した場合、自動的に中断 (sleep) し再試行を行う。 Linux はそれをハードエラーとして取り扱い即座に復帰する。

伝統的に、関数 execlp ()と execvp ()は、上で説明したエラーと、これら 2 つの関数自身が返す ENOMEME2BIG 以外の全てのエラーを無視していたが、 今では、上で説明した以外のエラーが発生した場合でも、 返ってくるよう変更された。

準拠

POSIX.1-2001.