| 日本−日本語 |
|
|
|
![]() |
HP-UX リファレンス: セクション 2 : システムコール > eexec(2)HP-UX 11i Version 2: September 2004 |
|
名称execl(), execle(), execlp(), execv(), execve(), execvp() ― ファイルの実行 構文#include <unistd.h> 説明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) を参照)。 プロセスには、次の属性もあります。
スクリプトファイルの最初の行は、最初の 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_MAGIC マジックナンバーが ld ld(1) を参照) の -N オプションで生成されたファイルです。 デッドロックの可能性を回避するためにマルチスレッドアプリケーションでは execve() コールの使用をお奨めします。 参照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 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||