exec、execl、execle、execlp、execv、execve、execvp、exect、または fexecve サブルーチン
目的
ファイルを実行します。
ライブラリー
標準 C ライブラリー (libc.a)
構文
#include <unistd.h>
extern
char **environ;
int execl (
Path,
Argument0 [, Argument1, ...], 0)
const char *Path, *Argument0, *Argument
1, ...;
int execle (
Path,
Argument0 [, Argument1, ...], 0,
EnvironmentPointer)
const
char *Path, *Argument0, *Argum
ent
1, ...;
char *const EnvironmentPointer[ ];
int execlp (
File,
Argument0 [, Argument1
, ...], 0)
const char *File, *Argument0, *Argument
1, ...;
int execv (
Path,
ArgumentV)
const char *Path;
char *const ArgumentV[ ];
int execve (
Path,
ArgumentV,
EnvironmentPointer)
const char *Path;
char
*const ArgumentV[ ], *EnvironmentPointer
[ ];
int execvp (
File,
ArgumentV)
const char *File;
char *const ArgumentV[ ];
int exect (
Path,
ArgumentV,
EnvironmentPointer)
char *Path, *ArgumentV, *EnvironmentPointer [ ];
int fexecve (FileDescriptor, ArgumentV, EnvironmentPointer)
int FileDescriptor;
char *const ArgumentV[ ], *EnvironmentPointer[ ];
説明
EXEC サブルーチンは、そのすべての形式で、呼び出しプロセスで新しいプログラムを実行します。 EXEC サブルーチンは新規プロセスを作成しませんが、 新規プロセス・イメージと呼ばれる新規プログラムで現行プログラムをオーバーレイします。 新規プロセス・イメージ・ファイルは、以下の 3 つのファイル・タイプのいずれかにすることができます。
- XCOFF ファイル形式の実行可能バイナリー・ファイル。
- シェル・プロシージャーを含む実行可能テキスト・ファイル ( 実行可能プログラム および EXEC サブルーチンのみが、このタイプの新規プロセス・イメージ・ファイルを許可します)。
- 実行する実行可能バイナリー・ファイルまたはシェル・プロシージャーを指定するファイル。
Fexecve サブルーチンは 実行 サブルーチンと同等ですが、fexecve サブルーチンは、実行されるオープン・ファイルのファイル・ディスクリプターを、パス名ではなく最初のパラメーターとして取る点が異なります。 ただし、以下が適用されます。
- ファイルが、オープン操作後に削除されるシェル・プロシージャーである場合、 Fexecve サブルーチンはシェルを開始しますが、シェルはそのファイルを見つけることができません。
- ファイルがシェル・プロシージャーであり、ファイルの親ディレクトリーがファイル・オープン操作後に削除された場合、 Fexecve サブルーチンは ENOENT (E) エラー・コードを戻します。
- Fexecve サブルーチンは、Role Based Access Control (RBAC) 実行許可を検査しません。
新規プロセス・イメージは、呼び出しプロセス・イメージから、セッション・メンバーシップ、補足グループ ID、プロセス・シグナル・マスク、および保留シグナルの各属性を継承します。
上記の最後のタイプは、以下の構文のヘッダーによって認識されます。
#! Path [String]
#! ファイル・タイプを識別するファイル マジックナンバーです。 実行されるファイルのパス名は、 パス パラメーターによって指定されます。 ストリング パラメーターは、タブ文字もスペース文字も含まないオプションの文字ストリングです。 指定した場合、このストリングは、新規プロセス・イメージ・ファイルの名前の前に引数として新規プロセスに渡されます。 ヘッダーは改行文字で終わらなければなりません。 呼び出されると、新規プロセスは Path パラメーターを ArgumentV[0] として渡します。 新規プロセス・イメージ・ファイルに String パラメーターが指定されている場合、 exec サブルーチンは ArgumentV[0] を、連結された String および Path パラメーター値に設定します。 渡される残りの引数は、 EXEC サブルーチンに渡されるものと同じです。
EXEC サブルーチンは、このプロセスによって未解決の 非同期入出力要求 を取り消そうとします。 非同期入出力要求を取り消すことができない場合、要求が完了するまでアプリケーションはブロックされます。
EXEC サブルーチンは ロード サブルーチンと似ていますが、 EXEC サブルーチンには明示的なライブラリー・パス・パラメーターがないという点が異なります。 代わりに、 exec サブルーチンは LIBPATH または LD_LIBRARY_PATH 環境変数を使用します。 LIBPATH 変数が設定されている場合は、 LD_LIBRARY_PATHを優先して使用されます。設定されていない場合は、 LD_LIBRARY_PATH が使用されます。 これらのライブラリー・パス変数は、 EXEC サブルーチンが実行されるプログラムに、呼び出し側プログラム (例えば、 水性 プログラム) より多くの特権がある場合には無視されます。
エクサクト サブルーチンは、 ptrace コマンドでトレースされる古いプログラムとの互換性のために組み込まれています。 実行中のプログラムは、強制的にハードウェア単一ステップ・モードになります。
パラメーター
項目 | 説明 |
---|---|
パス | 新規プロセス・イメージ・ファイルのパス名へのポインターを指定します。 ネットワーク・ファイル・システム (NFS) がシステムにインストールされている場合、このパスは別のノードにまたがることができます。 続行する前に、データがローカル仮想メモリーにコピーされます。 |
File | 新規プロセス・イメージ・ファイルの名前へのポインターを指定します。 ファイル パラメーターが絶対パス名でない限り、ファイルのパス接頭部は、 パス 環境変数で指定されたディレクトリーを検索することによって取得されます。 初期環境は、シェルによって提供されます。 注: 実行可能プログラム サブルーチンと EXEC サブルーチンは ファイル パラメーターを取りますが、残りの EXEC サブルーチンは パス パラメーターを取ります。 (環境については、 環境 の各種機能および Sh コマンドを参照してください。)
|
Argument0 [, Argument1, ...] | ヌル終了文字ストリングを指します。 これらのストリングは、新規プロセスで使用可能な引数リストを構成します。 規則により、少なくとも Argument0 パラメーターが存在している必要があり、 パス パラメーターまたはその最後のコンポーネントと同じストリングを指している必要があります。 |
ArgumentV | ヌル終了文字ストリングを指すポインターの配列を指定します。 これらのストリングは、新規プロセスで使用可能な引数リストを構成します。 規則により、 ArgumentV パラメーターは少なくとも 1 つのエレメントを持つ必要があり、 Path パラメーターまたはその最後のコンポーネントと同じストリングを指す必要があります。 ArgumentV パラメーターの最後のエレメントは、NULL ポインターです。 |
EnvironmentPointer | ヌル終了文字ストリングを指すポインターの配列。 これらのストリングは、新規プロセスの環境を構成します。 EnvironmentPointer パラメーターの最後のエレメントが NULL ポインターです。 |
FileDescriptor | 実行するオープン・ファイルのファイル記述子を指定します。 |
C プログラムが実行されると、C プログラムは以下のパラメーターを受け取ります。
main (ArgumentCount, ArgumentV, EnvironmentPointer)
int ArgumentCount;
char *ArgumentV[ ], *EnvironmentPointer[
];
この例では、 ArgumentCount パラメーターは引数のカウントであり、 ArgumentV パラメーターは引数自体を指す文字ポインターの配列です。 規則により、 ArgumentCount パラメーターの値は少なくとも 1 であり、 ArgumentV[0] パラメーターは、新規プロセス・イメージ・ファイルの名前を含むストリングを指します。
C 言語プログラムの メイン ルーチンは、ランタイム・スタート・オフ・ルーチンで自動的に開始されます。 このルーチンは、 EnvironmentPointerでプログラムに渡される環境配列を指すように environ グローバル変数を設定します。 このグローバル変数にアクセスするには、プログラムに以下の宣言を組み込みます。
extern char **environ;
実行可能プログラム、 EXEC、 実行可能プログラム、および EXEC サブルーチンは、 エンビロン グローバル変数を使用して、呼び出しプロセスの現行環境を新規プロセスに渡します。
呼び出しプロセスでオープンされているファイル記述子は、 実行時クローズ フラグが設定されているファイル記述子を除き、オープンのままです。 オープンしたままのファイル記述子の場合、ファイル・ポインターは変更されません。 (ファイル制御については、 fcntl.h ファイルを参照してください。)
新規プロセス・イメージ内の変換状態記述子およびメッセージ・カタログ記述子は未定義です。 新規プロセスの場合、カテゴリーの LC_ALL (L) 値とロケールの 「C」 値を指定する setlocale サブルーチンに相当するものが、始動時に実行されます。
新しいプログラムが共用ライブラリーを必要とする場合、 EXEC サブルーチンは、それぞれのライブラリーを検出し、オープンし、新しいプロセス・アドレス・スペースにロードします。 EXEC の発行者によって使用されている共有ライブラリーの参照カウントが減分されます。 共有ライブラリーは、 ライブラリー・パス 環境変数にリストされているディレクトリーで検索されます。 これらのファイルのいずれかがリモートの場合、データはローカル仮想メモリーにコピーされます。
EXEC サブルーチンは、キャッチされたすべてのシグナルをデフォルトのアクションにリセットします。 デフォルト・アクションの原因となるシグナルは、 EXEC サブルーチンの後も引き続き実行されます。 無視されたシグナルは無視され、シグナル・マスクは同じままで、シグナル・スタック状態はリセットされます。 (シグナルについては、 署名アクション サブルーチンを参照してください。)
新規プロセス・イメージ・ファイルの SetUserID モード・ビットが設定されている場合、 exec サブルーチンは新規プロセスの有効ユーザー ID を新規プロセス・イメージ・ファイルの所有者 ID に設定します。 同様に、新規プロセス・イメージ・ファイルの SetGroupID モード・ビットが設定されている場合、新規プロセスの実効グループ ID は、新規プロセス・イメージ・ファイルのグループ ID に設定されます。 新規プロセスの実ユーザー ID および実グループ ID は、呼び出しプロセスの実ユーザー ID および実グループ ID と同じままです。 ( SetID モードについては、 chmod サブルーチンを参照してください。)
EXEC 操作の終了時に、プロセスの保管済みユーザー ID と保管済みグループ ID は、常にプロセスの実効ユーザー ID と実効グループ ID に設定されます。
セット ID モード・ビットの一方または両方が設定され、実行されるファイルがリモート・ファイルである場合、ファイル・ユーザーおよびグループ ID はサーバーでアウトバウンド変換を経由します。 その後、クライアント・ノードに送信され、インバウンド変換テーブルに従って変換されます。 これらの変換された ID は、新規プロセスのユーザー ID およびグループ ID になります。
新規プロセスのプロファイル作成は無効になっています。
新規プロセスは、呼び出しプロセスから以下の属性を継承します。
- nice 値 ( getpriority サブルーチン、 設定優先度 サブルーチン、 ナイス サブルーチンを参照)
- プロセス ID
- 親プロセスの ID
- プロセス・グループ ID
- 半調整 値 ( セモップ サブルーチンを参照)
- tty グループ ID ( 出口、 AtExit、または 終了 (_Exit) サブルーチン、 署名アクション サブルーチンを参照)
- トレース フラグ ( ptrace サブルーチンの要求 0 を参照)
- アラーム・クロック・シグナルまでの残り時間 ( incinterval サブルーチン、 setitimer サブルーチン、および alarm サブルーチンを参照)
- 現行ディレクトリー
- ルート・ディレクトリー
- ファイル・モード作成マスク ( Umask サブルーチンを参照)
- ファイル・サイズ制限 ( ulimit サブルーチンを参照)
- リソース限界 ( GetrLimit サブルーチン、 SetrLimit サブルーチン、および vlimit サブルーチンを参照)
- tms_utime,tms_stime,tms_cutime、およびtms_ctimeTMS 構造体のフィールド ( 回 サブルーチンを参照)
- ログイン・ユーザー ID
正常に完了すると、 EXEC サブルーチンは更新のマークを付けます。st_atimeファイルのフィールド。
例
- コマンドを実行してパラメーターを渡すには、次のように入力します。
実行可能プログラム サブルーチンは、 パス 環境変数にリストされている各ディレクトリーで LS コマンドを検索してから、このコマンドで現行プロセス・イメージをオーバーレイします。 LS コマンドを実行できない場合を除き、 実行可能プログラム サブルーチンは戻されません。execlp("ls", "ls", "-al", 0);
注: この例ではシェル・コマンド・プロセッサーを実行しないため、シェルによって解釈される操作 (ファイル名にワイルドカード文字を使用するなど) は無効です。 - シェルを実行してコマンドを解釈するには、次のように入力します。
これにより、 「-c」 フラグを指定して Sh コマンドが実行されます。これは、以下のパラメーターが解釈されるコマンドであることを示します。 この例では、 execlp サブルーチンの代わりに execl サブルーチンを使用します。絶対パス名 /usr/bin/sh が指定されているため、パス検索は不要です。execl("/usr/bin/sh", "sh", "-c", "ls -l *.c", 0);
通常、この例に示すように、子プロセスでシェル・コマンドを実行する方が、単に EXEC サブルーチンを使用するよりも有用です。 これを行う最も簡単な方法は、 システム サブルーチンを使用することです。
- 実行するプログラムを指定する新規プロセス・ファイルの例を以下に示します。
このファイルに名前が付けられている場合reverseコマンド行に次のコマンドを入力します。#! /usr/bin/awk -f { for (i = NF; i > 0; --i) print $i }
このコマンドは、以下のコマンドを実行します。reverse chapter1 chapter2
/usr/bin/awk -f reverse chapter1 chapter2
注: EXEC サブルーチンは、新規プロセス・イメージ・ファイルの最初の行のみを使用し、残りの行は無視します。 また、 アーク コマンドは、# (ポンド記号) の後に続くテキストをコメントとして解釈します。
戻り値
正常に完了すると、呼び出しプロセス・イメージが新規プロセス・イメージによってオーバーレイされるため、 EXEC サブルーチンは戻りません。 EXEC サブルーチンが呼び出しプロセスに戻ると、値 -1 が戻され、エラーを識別するために エラー番号 グローバル変数が設定されます。
エラー・コード
EXEC サブルーチンが失敗すると、以下の 1 つ以上のエラー・コードを戻します。
項目 | 説明 |
---|---|
EACCES | 新規プロセス・イメージ・ファイルは通常ファイルではありません。 |
EACCES | 新規プロセス・イメージ・ファイルのモードは、実行許可を拒否します。 |
ENOEXEC | EXEC サブルーチンは、 実行可能プログラム サブルーチンでも EXEC サブルーチンでもありません。 新規プロセス・イメージ・ファイルには適切なアクセス許可がありますが、ヘッダー内のマジック・ナンバーが無効です。 |
ENOEXEC | 新規プロセス・イメージ・ファイルのヘッダーに有効なマジック・ナンバーがありますが、ヘッダーが損傷しているか、ファイルが実行されるマシンに対して正しくありません。 |
ETXTBSY | 新規プロセス・イメージ・ファイルは、何らかのプロセスによる書き込みのために現在オープンされているピュア・プロシージャー (共有テキスト) ファイルです。 |
ENOMEM | 新規プロセスには、システムが定める最大値である MAXMEM (M) コンパイラー・オプションで許可されているメモリーよりも多くのメモリーが必要です。 |
E2BIG | 新規プロセス引数リストのバイト数が、システムが課した制限を超えています。 この制限は、SMIT を使用してスーパーユーザーまたはシステム・グループ・ユーザーが設定できるシステム構成可能値です。 詳しくは、 カーネル・チューナブル・パラメーター を参照してください。 |
EFAULT | Path、 ArgumentV、または EnvironmentPointer パラメーターがプロセス・アドレス・スペースの外部を指しています。 |
EPERM | SetUserID または SetGroupID モード・ビットがプロセス・イメージ・ファイルに設定されます。 サーバーまたはクライアントの変換テーブルは、このユーザーまたはグループ ID の変換を許可しません。 |
パス名の解決を必要とする条件のために EXEC サブルーチンが失敗した場合は、以下の 1 つ以上のエラー・コードを戻します。
項目 | 説明 |
---|---|
EACCES | 検索許可はパス接頭部のコンポーネントで拒否されました。 セキュア・マウントが原因でアクセスが拒否された可能性があります。 |
EFAULT | パス パラメーターが、プロセスの割り振り済みアドレス・スペースの外部を指しています。 |
EIO | 操作中に入出力 (I/O) エラーが発生しました。 |
ELOOP | パス パラメーターの変換中に検出されたシンボリック・リンクが多すぎます。 |
ENAMETOOLONG | パス名のコンポーネントが 255 文字を超えており、プロセスに 切り捨てを許可しない 属性 ( ulimit サブルーチンを参照) があるか、またはパス名全体が 1023 文字を超えています。 |
ENOENT | パス接頭部のコンポーネントが存在しません。 |
ENOENT | シンボリック・リンクが指定されましたが、それが参照するファイルが存在しません。 |
ENOENT | パス名がヌルです。 |
ENOTDIR | パス接頭部のコンポーネントがディレクトリーではありません。 |
ESTALE | プロセスのルート・ディレクトリーまたは現行ディレクトリーは、アンマウントされた仮想ファイル・システム内にあります。 |
また、古いプロセス・イメージが上書きされた後で new-process ファイルを使用すると、いくつかのエラーが発生する可能性があります。 これらのエラーには、新規データおよびスタック・レジスターのセットアップの問題、共有ライブラリーのマッピングの問題、または新規プロセス・ファイルの読み取りの問題が含まれます。 呼び出しプロセスに戻ることができないため、これらのエラーのいずれかが発生すると、システムは シグキル シグナルをプロセスに送信します。
共有ライブラリーのマッピング中にエラーが発生した場合、シグナル シグキル がプロセスに送信される前に、エラーの理由を説明するエラー・メッセージが標準エラーに書き込まれます。 共用ライブラリーをマップできない場合、サブルーチンは以下のいずれかのエラー・コードを戻します。
項目 | 説明 |
---|---|
ENOENT | 共有ライブラリー・ファイルのパス名の 1 つ以上のコンポーネントが存在しません。 |
ENOTDIR | 共有ライブラリー・ファイルのパス接頭部のコンポーネントがディレクトリーではありません。 |
ENAMETOOLONG | 共用ライブラリー・ファイルのパス名接頭部の構成要素が 255 文字を超えているか, あるいはパス名全体が 1023 文字を超えています。 |
EACCES | 共有ライブラリー・ファイルのパス接頭部にリストされているディレクトリーに対する検索許可が拒否されました。 |
EACCES | 共有ライブラリー・ファイル・モードは、実行許可を拒否します。 |
ENOEXEC | 共有ライブラリー・ファイルには適切なアクセス許可がありますが、ヘッダー内のマジック・ナンバーが無効です。 |
ETXTBSY | 共有ライブラリー・ファイルは、他のプロセスによる書き込みのために現在オープンされています。 |
ENOMEM | 共用ライブラリーには、システムが定める最大値で許可されているメモリーよりも多くのメモリーが必要です。 |
ESTALE | プロセス・ルートまたは現行ディレクトリーは、アンマウントされた仮想ファイル・システム内にあります。 |
EPROCLIM | WLM が実行中の場合は、クラス内のプロセス、スレッド、またはログインの数の制限が満たされている可能性があります。 |
Fexecve サブルーチンが失敗した場合は、以下のいずれかのエラー・コードも戻されることがあります。
項目 | 説明 |
---|---|
EBADF | FileDescriptor 引数が、有効なオープン・ファイル記述子を指定していません。 |
ENOENT | FileDescriptor 引数はシェル・プロシージャーを指していますが、ファイルの元の親ディレクトリーは削除されています。 |
NFS がシステムにインストールされている場合、以下の条件が満たされていると、 exec サブルーチンも失敗する可能性があります。
項目 | 説明 |
---|---|
ETIMEDOUT | 接続がタイムアウトになりました。 |