本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リファレンス: セクション 2 : システムコール > e

exec(2)

HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

execl(), execle(), execlp(), execv(), execve(), execvp() ― ファイルの実行

構文

#include <unistd.h> 
 
extern char **environ; 
 
int execl(const char *path,
          const char *arg0, ...
          /*
           *  [const char *arg1, ..., const char *argn,]
           */
           (char *)0
);
 
int execle(const char *path,
           const char *arg0, ...
           /*
            *  [const char *arg1, ..., const char *argn,]
            */
            (char *)0,
            char * const envp[]
);
 
int execlp(const char *file,
           const char *arg0, ...
           /*
            *  [const char *arg1, ..., const char *argn,]
            */
            (char *)0
);
 
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[]); 

特記事項

ANSI C ", ... " 構文は、可変長の引き数リストを意味し、その省略可能および必須のメンバーは、対応するコメント (/* */) の中に示されています。

説明

exec*() システムコールのすべての形式は、通常の実行可能ファイルから現在のプロセスに、現在のプログラムを置き換えながらプログラムをロードします。 path または file 引き数は、実行可能なオブジェクトファイルか、インタプリタ用のデータファイルのどちらかを参照します。 後者の場合、データファイルはスクリプトファイルとも呼ばれます。

呼び出しプロセスがマルチスレッドの場合、 exec 関数を呼び出すと、呼び出しプロセス内のすべてのスレッドとライトウェイトプロセスは終了し、新しい実行可能イメージがロードされて実行されます。 スレッド固有データのデストラクタ関数は呼び出されません。 exec 関数が失敗して呼び出し元に戻った場合は、呼び出しプロセス内のスレッドとライトウェイトプロセス (LWP) は終了しません。

実行可能なオブジェクトファイルは、ヘッダー a.out(4) 参照)、テキストセグメント、およびデータセグメントで構成されます。 データセグメントは、初期化された部分と初期化されていない部分 (bss) から構成されます。 代わりに execlp() および execvp() では、スクリプトを解釈するために、POSIX シェル sh-posix(1) 参照) をロードできます。 exec*() 呼び出しは正常終了すると、新しいプログラムが呼び出したプログラムを書き換えるので、値を返しません。

C プログラムを実行する場合は、次のように呼び出します。

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

argc は引き数の数、 argv は引き数自身への文字型ポインターの配列のアドレスです。 argc は、通常、1 以上の値を取ります。 配列の最初のメンバーは、ファイル名を含んだ文字列を指します。 main からの終了状態は、 exit(2) で説明します。

path は、新しいプログラムを含む実行可能ファイルを表すパス名を指します。

file (execlp() または execvp() 中) は、新しいプログラムを含む実行可能ファイルを示すファイル名を指します。 このファイルのパスプリフィックスは、環境変数 PATH で渡されるディレクトリをサーチすることで得られます environ(5) 参照)。 環境は、シェルによって提供されます sh(1) 参照)。 file が実行可能なマジックナンバー magic(4) を参照) を持っていない場合は、シェルスクリプトとして POSIX シェルに渡されます。

arg0, ..., argn は、null で終わる文字列への 1 つまたは複数のポインターです。 これらの文字列は、新しいプログラムに利用可能な引き数リストを構成します。 規約によって、少なくとも arg0 が表示され、 path または path の最後の構成要素と同じ文字列を指すようにしてください。

argv は、null で終わる文字列を指す文字型の配列です。 これらの文字列は、新しいプログラムに利用可能な引き数リストを構成します。 規約によって、 argv は少なくとも 1 つのメンバーを持ち、 path または path の最後の構成要素と同じ文字列を指すようにしてください。 argv は、null ポインターで終了します。

envp は、null で終わる文字列を指す文字型の配列です。 これらの文字列は、新しいプログラムが実行される環境を構成します。 envp は、null ポインターで終了します。 execle() および execve() では、C の実行時、スタートオフルーチンは、大域セルに呼び出し元プログラムの環境へのポインターを置きます。

extern char **environ; 

これは、新しいプログラムに呼び出し元プログラムの環境を渡すために使用されます。

マルチスレッドアプリケーションでは、他のスレッドが環境変数を変更しているときに、 environ 変数を使った環境変数のアクセスや変更をしないでください。 環境変数に依存する関数の呼び出しも、環境変数にアクセスしているため environ 変数を使用するものと見なされます。

開いているファイル記述子は、実行時のクローズフラグが設定されている場合を除いて 開かれたままです fcntl(2) 参照)。 ファイルオフセット、アクセスモード、および開いているファイル記述子の状態フラグは変更されません。

実行を開始した時に、通常の実行可能ファイルは、短時間開かれるだけということに注意してください。 他の実行可能ファイル型では長時間、またある環境では無期限に開いたままにできます。

プロセスによるシグナルの処理は、プロセスがキャッチしたシグナルがデフォルト値に設定されている signal(2) 参照) 場合を除いて、 exec*() によって変更されません。

path または file で示される実行可能ファイルのユーザー ID 設定モードビットが設定されている場合は chmod(2) 参照)、 exec*() は、新しいプロセスの有効ユーザー ID を実行可能ファイルのユーザー ID に設定します。 同様に、実行可能ファイルのグループ ID 設定モードビットが設定されている場合は、プロセスの有効グループ ID は、実行可能ファイルのグループ ID に設定されます。 プロセスの実ユーザー ID および実グループ ID は、変更されません。 ユーザー ID 設定およびグループ ID 設定機能は、スクリプトには通常は適用されません。 したがって、 execlp() または execvp() がスクリプトを実行する場合は、ユーザー ID 設定およびグループ ID 設定ビットは設定されていても無視されます。 この動作は、カーネル調整変数 secure_sid_scripts を 0 にすれば無効にすることができます。

プロセスの保存ユーザー ID および保存グループ ID は、ユーザー ID 設定またはグループ ID 設定が有効かどうかに関わらず、常に exec*() の最後でそれぞれ有効ユーザー ID および有効グループ ID に設定されます。

呼び出し元プログラムに付属している共有メモリーセグメントは、新しいプログラムには付属しません shmop(2) 参照)。

テキストおよびデータセグメント メモリーのロックは、新しいプログラムには渡されません plock(2) 参照)。

新しいプロセスに対しては、プロフィールは行われません profil(2) を参照)。

プロセスには、次の属性もあります。

  • 現在のワークディレクトリ

  • ファイル作成モードマスク umask(2) 参照)

  • ファイルロック fcntl(2) 参照)、ただし exec でクローズされるファイルを除く。

  • ファイルサイズ上限 ulimit(2) 参照)

  • インターバルタイマー getitimer(2) 参照)

  • ナイス値 nice(2) 参照)

  • ナイス値 (親プロセス ID 参照)

  • 未処理のシグナル

  • プロセス ID

  • プロセスグループ ID

  • 実ユーザー ID

  • 実グループ ID

  • プロセス開始時刻

  • リアルタイムの優先順位 rtprio(2) 参照)

  • ルートディレクトリ chroot(2) 参照)

  • semadjsemop(2) 参照)

  • セッションメンバーシップ

  • シグナルマスク sigvector(2) 参照)

  • 補助グループ ID

  • アラームクロック シグナルまでの所要時間 alarm(2) 参照)

  • トレースフラグ ptrace(2)PT_SETTRC 要求を参照)

  • tms_utime、 tms_stime、 tms_cutime および tms_cstime times(2) 参照)

スクリプトファイルの最初の行は、最初の 2 バイトが #! で始り、ゼロまたは複数個のスペース、 インタプリタ または インタプリタ 引き数 がその次にくるようにしてください。 次のように入力します。

#! インタプリタ  [引き数]

1 つ以上のスペースまたはタブで インタプリタ引き数 を区切ります。 最初の行は、改行または null 文字で終了します。

スクリプトファイルが実行されると、システムは指定された インタプリタ を実行可能なオブジェクトファイルとして実行します。 execlp() または execvp() の場合には、インタプリタ名の検索は行われません。

引き数 は、 インタプリタ とタブまたはスペースの後に続きます。 引き数 が与えられた場合は、引き数が argv[1] として インタプリタ に渡され、スクリプトファイル名は argv[2] として渡されます。 それ以外の場合は、スクリプトファイル名は argv[1] として渡されます。 argv[0] は、 exec*() 呼び出しで指定されたように渡されます。 exec*() 呼び出しで指定された他のすべての引き数は、スクリプトファイル名に続いて渡されます (すなわち、引き数がある場合は argv[3] の、ない場合は argv[2] の始めに)。

インタプリタによって、このような インタプリタ引き数 の処理を内部で行うため、ユーザーのスクリプトファイルには記述しないようになっている場合があります。

スクリプトファイルの最初の行がシステム定義の文字の最大値を超えている場合は、 exec*() は失敗します。 この制限の最小値は 32 です。

ユーザー ID 設定およびグループ ID 設定ビットは、インタプリタにではなくスクリプトに付けます。

実行可能オブジェクトファイルには、引き数 argv[1], ..., argv[n] が渡されます。 argv[0]exec*() 呼び出しで指定されたように渡されます。 argv または argv[0] に null が指定された場合は、null 文字列へのポインターが argv[0] として渡されます。

戻り値

exec*() が呼び出し元プログラムに戻る場合は、エラーが発生しています。 戻り値は -1 で、エラーを示す値が errno に設定されます。

エラー

exec*() が失敗して、呼び出し元プログラムに戻る場合、次の値の 1 つに errno が設定されます。

[E2BIG] 

新しいプログラムの引き数リストに環境変数を加えたバイト数が、システムによって決められた制限を超えている場合。 この制限は、HP-UX システムでは、少なくとも 5120 バイトです。

[EACCES] 

実行可能ファイルまたはインタプリタの読み取りパーミッションが拒否され、プロセスのトレースフラグ (PT_SETTRCptrace(2) 要求を参照) が設定されている場合。

[EACCES] 

実行可能ファイルまたはインタプリタのパスプリフィックス中にリストされたディレクトリに対するサーチパーミッションが拒否される場合。

[EACCES] 

実行可能ファイルまたはインタプリタが通常のファイルでない場合。

[EACCES] 

path または file で指定されたファイルが、実行不可能な場合。 少なくとも 1 つのアクセスパーミッション ビットまたはアクセス制御リストのエントリーの実行ビットが設定されていない限り、スーパーユーザーはファイルを実行できません。

[EFAULT] 

pathargv または envp が不正なアドレスを指している場合。 このエラーが発見できるかどうかは、インプリメンテーションに依存しています。

[EINTR] 

exec*() システムコール中にシグナルが捕捉されました。

[EINVAL] 

実行可能ファイルが exec*() を実行したアーキテクチャと互換でない場合。 この場合、これは異なるアーキテクチャ用だと推測されます。 すべてのアーキテクチャの実行可能ファイルが認識されるとは保証されていません。

[EINVAL] 

argv が null を指していて、null ポインターによる参照が許可されている。 この場合、null は有効なアドレスですが、無効な引き数と見なされます。

[ELOOP] 

パス名の解釈中に遭遇したシンボリックリンクが多すぎる場合。

[ENAMETOOLONG] 

_POSIX_NO_TRUNC が有効なときに、実行可能ファイルのパス名またはインタプリタのパス名が PATH_MAX バイトを超えている場合、またはパス名の構成要素の長さが NAME_MAX バイトを超えている場合。

[ENOENT] 

path が空の文字列を指している場合。

[ENOENT] 

実行可能ファイルのパス名またはインタプリタのパス名の構成要素存在しない場合。

[ENOEXEC] 

実行可能ファイルがそのヘッダー中に示されたサイズより小さい場合、あるいは何か矛盾がある場合。 このエラーを検出できるかどうかは、インプリメンテーションに依存しています。

[ENOEXEC] 

関数呼び出しが execlp() でも execvp() でもなく、実行可能ファイルは適切なアクセスパーミッションを持ってはいるが、マジックナンバーが正しくない場合、または最初の行の初めの 2 バイトが文字 #! でない場合。

[ENOEXEC] 

スクリプトファイルの最初の行のバイト数がシステムの最大値を超えている場合。

[ENOMEM] 

新しいプロセスがシステムによって決められた最大値内で利用可能、または許されたメモリー以上を要求した場合。

[ENOTDIR] 

実行可能ファイルのパスプリフィックスまたはインタプリタのパスプリフィックスの構成要素が、ディレクトリでない場合。

[ETXTBSY] 

実行可能ファイルが現在書き込み可能になっている場合。

警告

共有できない実行可能ファイルは、サポートされません。 このファイルは、 EXEC_MAGIC マジックナンバーが ld ld(1) を参照) の -N オプションで生成されたファイルです。

デッドロックの可能性を回避するためにマルチスレッドアプリケーションでは execve() コールの使用をお奨めします。

制約

HP プロセスリソースマネージャ

オプションの HP プロセスリソースマネージャ (PRM) ソフトウェアが、インストールされ、構成されている場合、プロセスのプロセスリソースグループ ID は、 exec*() によって変更されません。 HP PRM の構成方法の詳細については、 prmconfig(1) を、プロセスリソースグループの定義については、 prmconf(4) を参照してください。

参照

sh(1), sh-posix(1), kctune(1M), alarm(2), exit(2), fork(2), nice(2), ptrace(2), semop(2), signal(2), times(2), ulimit(2), umask(2), a.out(4), acl(5), environ(5), signal(5), thread_safety(5)

HP プロセスリソースマネージャ: 『HP プロセスリソースマネージャ ユーザーズガイド』 中の prmconfig(1), prmconf(4)

標準準拠

environ: AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1

execl(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1

execle(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1

execlp(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1

execv(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1

execve(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1

execvp(): AES, SVID2, SVID3, XPG2, XPG3, XPG4, FIPS 151-2, POSIX.1

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 1983-2004 Hewlett-Packard Development Company, L.P.