標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.1 |
両方 |
#define _POSIX_SOURCE
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, …, NULL);
int execle(const char *path, const char *arg, …, NULL, char *const envp[]);
int execlp(const char *file, const char *arg, …, NULL);
int execv(const char *path, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
int execvp(const char *file, char *const argv[]);
exec 関数のすべてが、現行のプロセス・イメージを HFS (階層ファイル ・システム) のファイルから取得した新しいプロセス・イメージに置き換える ことによって、新規プログラムを実行します。
MVS™ データ・セットと HFS ファイルの名前の指定についての詳細は 、「z/OS XL C/C++ プログラミング・ガイド」を参照してください
呼び出しプロセスが新規プロセスで上書きされるので、正常終了の 場合、exec 関数は制御を戻しません。
path 引数は、ファイルの絶対パス名または 相対パス名を指定するストリングです。このファイルには、実行されるプロセスのイメージが 含まれています。
file は、実行されるプロセスのイメージが 含まれているファイルのパス名を判別するのに使用される ストリングです。file にスラッシュ文字 (/) が含まれている場合、ファイルの絶対パス名または相対パス名であることが 想定されます。file にスラッシュが含まれていない場合、システムは、PATH 環境変数で指定した ディレクトリーのリストで、指定のファイル名を検索します。システムは PATH 変数に現れる順番で ディレクトリーをチェックして、file ストリングと名前 が一致する最初のファイルを実行します。ファイルは HFS に常駐していなければなりません。
STEPLIB 環境変数が指定されていない場合、exec() の デフォルトの動作は、STEPLIB=CURRENT が指定されている 場合と同じになります。
呼び出されるプログラムが set-user-ID また は set-group-ID ファイルで、さらにファイルの user-ID また は group-ID が現行プロセス・イメージのものとは異なる 場合、新規プロセス・イメージ用の STEPLIB 環境に 組み込まれるデータ・セット は、set-user-id および set-group-id プログラムの システム認可リストになければなりません。認可リストにあるデータ・セットだけが、新規プロセス・イメージの STEPLIB 環境に組み込まれます。認可リスト、および STEPLIB のパフォーマンス考慮事項に関する詳細は、「z/OS UNIX System Services 計画) を参照してください。
メッセージを取り込むために使用するファイルは、oe_env_np サービス (BPX1ENV) を呼び出して、_BPXK_JOBLOG を別のファイル記述子に指定することによって、随時変更できます。
指定されているファイル記述子に、fork または exec でクローズのマークが付けられた場合は、メッセージ取り込みがオフになります。
メッセージ取り込みは、プロセスに関連します。1 つのプロセス下では、すべてのスレッドでジョブ・ログ・ファイルを共用します。メッセージ取り込みは、そのプロセス下のどのスレッドからでも開始できます。
単一のアドレス・スペース内の複数の各プロセスで、異なるファイルを JOBLOG ファイルとしてアクティブにすることができます。一部またはすべてのプロセスで同じファイルを共用できます。また、一部のプロセスで、ほかのプロセスではアクティブにしないメッセージ取り込みをアクティブにすることができます。
ファイル記述子で表すことができるファイルだけを、ジョブ・ログ・ファイルとして使用できます。MVS データ・セットは使用できません。
メッセージ取り込みは、fork() または spawn() で伝搬されます。 ファイル記述子が指定された場合は、fork または作成されるプロセスでメッセージ取り込みが続行されるように、物理ファイルは同じものでなければなりません。STDERR が指定された場合は、ファイル記述子を別の物理ファイルに再マップできます。
メッセージ取り込みは、exec() または spawn() で指定変更できます。変更するには、_BPXK_JOBLOG 環境変数を exec() または spawn() のパラメーターとして指定します。
execl("/bin/sh",
"sh",
"--",
fully_expanded_pathname,
arg1, arg2, ..., argn,
NULL
);
ここで、arg1、arg2、...、argn は execlp() または execvp() への
呼び出し元の引数であり、fully_expanded_pathname は現行 PATH の
ディレクトリーの検索により検出されるシェル・スクリプトのパス名です。arg、…、NULL は、呼び出されている プロセスの引数を指定する NULL 終了文字ストリングを指す一連のポインターです。新規プロセスが main() の場合、これらのストリングは配列に保管され、その 配列を指すポインターは argv パラメーターに渡されます。最初の引数は必須で、この引数は、exec が開始しているプロセスに関連したファイルの名前を含むストリングを指す必要があります。NULL ポインターは、最後の引数ストリング・ポインターの次に 指定しなければなりません。
argv[ ] は、NULL 終了文字ストリングを指す一連のポインターからなる配列を指す ポインターです。配列の終わりをマークするため、最後の文字ストリングの 後に NULL ポインターがなければなりません。これらの文字ストリングは、呼び出されるプロセスに対する引数として 使用されます。argv[0] は、exec が開始しようとしているプロセスと関連付けられた ファイルの名前が入っているストリングを指している必要があります。envp[] は、NULL 終了文字ストリングを指す一連のポインターからなる配列を指す ポインターです。配列の終わりをマークするため、最後の文字ストリングの 後に NULL ポインターがなければなりません。envp のストリングは、新規プロセス用に 環境変数を提供します。
どの種類の exec 関数でも、実行する新規プロセスと新規プロセス に渡す必要のある引数のコレクションが含まれているファイルを見つける方法が提供 されます。それぞれの種類の exec ごとに、この情報を指定する独自のメソッドが あります。
exec 呼び出しの中には、envp 引数を使用して明示的に環境を 渡すものもあります。環境が明示的に渡されないバージョン - execl()、execlp()、execv()、および execvp() - では、システムは、呼び出し元の環境全体を使用します。呼び出し元の環境は、外部変数の **environ が指す環境変数になると想定されます。
sysconf(_SC_ARG_MAX) を呼び出して z/OS®UNIX サービスから取得 される ARG_MAX 変数では、呼び出されるプロセスに渡される引数と 環境変数に使用できる最大バイト数を指定します。バイト数には、各ストリングの NULL ターミネーターが含まれます。
exec 関数で開始されたプロセスには、close-on-exec フラグ の FD_CLOEXEC でオープンされたファイルを除いて、呼び出し元に存在して いたオープン・ファイル記述子がすべてあります。このフラグについての詳細は、fcntl() - オープン・ファイル記述子の制御を 参照してください。オープンしたままのファイル記述子では、すべての属性が 未変更のままです (ファイル・ロックを含む)。
呼び出しプロセス・イメージでオープン中の ディレクトリー・ストリームは、新規プロセス・イメージで クローズされます。
変換記述子とメッセージ・カタログ記述子の状態は 未定義です。
呼び出し元で無視されるよう設定されたシグナル SIG_IGN は、新規プロセス・イメージで無視されるように設定されます。無視されているシグナルの取り扱いには注意してください。ハンドラーを指定する sigaction() は渡されません が、SIG_IGN は渡されます。シグナルのブロック化も渡されます。その他のすべてのシグナルは、呼び出し元がそのシグナルを処理した方法 にかかわらず、新規プロセス・イメージでデフォルト・ アクション SIG_DFL に設定されます。
新規プロセスの実ユーザー ID (UID)、実グループ ID (GID)、および補足グループ ID は、呼び出し元のものと同じです。プログラム・ファイルの set-user-ID モード・ビットがオン の場合、新規プロセスの有効ユーザー ID はファイルの 所有者に設定されます。同様に、プログラム・ファイルの set-group-ID モード・ビット がオンの場合、新規プロセスの有効グループ ID は ファイルのグループに設定されます。新規プロセス・イメージの有効ユーザー ID は 保管済み set-user-ID として保管され、新規プロセス・イメージの有効グループ ID は 保管済み set-group-ID として保管されます。
呼び出しプロセス・イメージに付加された共用メモリー・セグメントはいずれも、新規プロセス・イメージに付加されません。shmat() - 共用メモリー付加操作を参照してください。呼び出しプロセス・イメージに付加された共用メモリー・セグメントは、切り離されます (つまり、shm_nattch の値が 1 つ減ります)。これが共用メモリー・セグメントに付加された最後のスレッド であり、さらに shmctl() RMID が発行された場合、そのセグメントはシステムから取り除かれます。
XPG4.2 の特殊な動作: インターバル・タイマーは、exec の間中保持されます。
exec 関数は、正常終了時には、指定したプログラム・ファイルを自動的 にオープンし、そのファイルのアクセス時間 st_atime を更新 します。プログラムがファイルから読み取られた後で、プログラム・ファイルは自動的にクローズされます。このクローズ操作の正確な時刻は未定義です。
プログラムが MVS プログラム検索順序で見つかる場合、MVS プログラム名は RACF FACILITY クラスで定義された BPX.STICKYSUG.program_name リソース・プロファイルである必要があります。リソース・プロファイルの定義について詳しくは、 z/OS UNIX System Services 計画ブックを参照してください。この制限に従わない場合、コード xxxxE055 での異常終了 EC6 の原因となります。
呼び出しプロセスが新規プロセスで上書きされるので、正常終了の 場合、exec 関数は制御を決して戻しません。
理由コードを調べて、エラーが起きた正確な理由を判別します。理由コード、JRExecParmErr および JRExitRtnError が戻りコードに 付随することがあります。
理由コード | 説明 |
---|---|
X'xxxx0C27' | ターゲットの HFS ファイルのフォーマット設定が正しく ないため、実行可能ファイルになりません。 |
X'xxxx0C31' | ターゲットの HFS ファイルは、実行システム でサポートされているレベルより高いレベルで作成されています。 |
⁄* CELEBE03
This example runs a program, using the execl() function.
*⁄
#define _POSIX_SOURCE
#include <stdio.h>
#include <sys⁄wait.h> ⁄*FIX: used be <wait.h>*⁄
#include <sys⁄types.h>
#include <unistd.h>
main() {
pid_t pid;
int status;
if ((pid = fork()) == 0) {
execl("⁄bin⁄false", NULL);
perror("The execl() call must have failed");
exit(255);
}
else {
wait(&status);
if (WIFEXITED(status))
printf("child exited with status of %d¥n", WEXITSTATUS(status));
else
puts("child did not exit successfully¥n");
}
}
child exited with status of 1