.\" Copyright (c) 1980, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)execve.2 8.5 (Berkeley) 6/1/94 .\" %FreeBSD: src/lib/libc/sys/execve.2,v 1.39 2004/07/04 20:55:48 ru Exp % .\" .\" $FreeBSD$ .Dd June 1, 1994 .Dt EXECVE 2 .Os .Sh 名称 .Nm execve .Nd ファイルを実行する .Sh ライブラリ .Lb libc .Sh 書式 .In unistd.h .Ft int .Fn execve "const char *path" "char *const argv[]" "char *const envp[]" .Sh 解説 .Fn execve システムコールは、呼び出しプロセスを新しいプロセスに変換します。 新しいプロセスは .Em new process file と呼ばれる通常のファイルに基づいて構成されます。 このファイルの名前は .Fa path によって指定されます。 このファイルは実行可能オブジェクトファイル、またはインタプリタ用の データのファイルです。 実行可能オブジェクトファイルは、識別ヘッダに データのページが続いたもので構成されます。 このデータは、初期プログラム (テキスト) と初期値ありデータのページを表します。 追加のページはヘッダの指定によって 0 データで初期化される場合があります。 .Xr elf 5 および .Xr a.out 5 を参照してください。 .Pp インタプリタファイルは次の形式の行で開始します。 .Pp .Bd -ragged -offset indent -compact .Sy \&#! .Em interpreter .Bq Em arg .Ed .Pp インタプリタファイルが .Sy execve されるとき、システムは実際には指定の .Em interpreter を .Sy execve します。 オプションの .Em arg が指定されている場合、それは .Em interpreter の 1番目の引数になり、元々の .Sy execve で指定されたファイルの名前は 2 番目の引数になります。 それ以外では .Sy execve で指定されたファイルの名前が 1番目の引数になります。 元々の引数はシフトされて後続の引数に なります。 0 番目の引数は指定された .Em interpreter に設定されます。 .Pp 引数 .Fa argv は、ヌル文字で終わる文字ポインタの配列を指すポインタです。 各文字ポインタはヌル文字で終わる文字列を指します。 これらの文字列は、新しいプロセスから参照できる引数リストを構成します。 少なくとも 1 つの引数が配列内に存在している必要があります。 慣習では、最初の要素が実行されたプログラムの名前になるはずです (たとえば、 .Fa path の最後の構成要素)。 .Pp 引数 .Fa envp も、ヌル文字で終わる文字ポインタの配列を指すポインタです。 各文字ポインタはヌル文字で終わる文字列を指します。 この配列を指すポインタは、通常、グローバル変数 .Va environ に保存されます。 これらの文字列は、引数としてコマンドへ直接 渡されない情報を新しいプロセスに渡します .Pf ( Xr environ 7 を参照)。 .Pp 呼び出しプロセスイメージ内でオープンされているファイル記述子は、 新しいプロセスイメージの中でもオープンされたままです。 しかし、close-on-exec フラグが設定されているものは例外です。 .Pf ( Xr close 2 と .Xr fcntl 2 を参照)。 オープンされたままの記述子は .Fn execve の影響を受けません。 .Fn execve が呼び出された時に標準の記述子 (0, 1 そして / または 2) がクローズされ、 ID 設定の結果、そのプロセスが特権を得た場合には、 それらの記述子は自動的にオープンされます。 特権を持っているかどうかに関わらず、どのプログラムも .Fn execve の呼び出しの前後で、これらの記述子が閉じたままとなると 仮定すべきではありません。 .Pp 呼び出しプロセスで無視するように設定されたシグナルは、 新しいプロセス内でも無視されるように設定されます。 呼び出しプロセスイメージ内で捕捉されるように設定されたシグナルは、 新しいプロセスイメージ内でデフォルトのアクションに 設定されます。 ブロックされたシグナルは、 シグナルアクションの変化とは無関係にブロックされたままになります。 シグナルスタックは未定義にリセットされます (詳細については .Xr sigaction 2 を参照してください)。 .Pp 新しいプロセスイメージファイルにユーザ ID 設定モードビット が設定されている場合 .Pf ( Xr chmod 2 を参照)、新しいプロセスイメージの実効ユーザ ID は、 新しいプロセスイメージファイルの所有者 ID に設定されます。 新しいプロセスイメージファイルにグループ ID 設定モードビットが 設定されている場合、新しいプロセスイメージの実効グループ ID は新しい プロセスイメージファイルのグループ ID に設定されます (実効グループ ID はグループリストの最初の要素です)。 新しいプロセスの実ユーザ ID、実グループ ID、およびその他の グループ ID は、呼び出しプロセスイメージと同じになります。 ユーザ ID 設定およびグループ ID 設定処理の後、実効ユーザ ID は 退避ユーザ ID として記録され、実効グループ ID は 退避グループ IDとして記録されます。 これらの値は、後で実効 ID を変更するのに使用できます .Pf ( Xr setuid 2 を参照)。 .Pp 該当するファイルシステムで .Cm nosuid オプションが有効な場合、または新しいプロセスファイルがインタプリタ ファイルの場合、ID 設定ビットは意味を持ちません。 実効 ID が変更された場合、システムコールのトレースは 無効になります。 .Pp また、新しいプロセスは呼び出しプロセスから次の属性を継承します。 .Pp .Bl -column ファイルモードマスク -offset indent -compact .It プロセス ID Ta Xr getpid 2 Ns \ を参照 .It 親プロセス ID Ta Xr getppid 2 Ns \ を参照 .It プロセスグループ ID Ta Xr getpgrp 2 Ns \ を参照 .It アクセスグループ Ta Xr getgroups 2 Ns \ を参照 .It 作業ディレクトリ Ta Xr chdir 2 Ns \ を参照 .It ルートディレクトリ Ta Xr chroot 2 Ns \ を参照 .It 制御端末 Ta Xr termios 4 Ns \ を参照 .It リソースの使用状況 Ta Xr getrusage 2 Ns \ を参照 .It インターバルタイマ Ta Xr getitimer 2 Ns \ を参照 .It リソースの使用制限 Ta Xr getrlimit 2 Ns \ を参照 .It ファイルモードマスク Ta Xr umask 2 Ns \ を参照 .It シグナルマスク Ta Xr sigvec 2 , .Xr sigsetmask 2 Ns \ を参照 .El .Pp .Fn execve システムコールの結果として実行されるとき、 プログラムは次のように呼び出されます。 .Bd -literal -offset indent main(argc, argv, envp) int argc; char **argv, **envp; .Ed .Pp ここで、 .Fa argc は .Fa argv の要素数 (``arg count'') であり、 .Fa argv は、引数自身を指す文字ポインタの配列を指します。 .Sh 戻り値 .Fn execve システムコールは現在のプロセスイメージを新しいプロセスイメージで 上書きするので、処理が成功した呼び出しには戻るプロセスがありません。 .Fn execve が呼び出しプロセスに返ってくる場合は エラーが起きています。 戻り値は -1 で、エラーを示すためにグローバル変数 .Va errno が設定されます .Sh エラー 次の場合、 .Fn execve システムコールは処理に失敗し、呼び出しプロセスに戻ります: .Bl -tag -width Er .It Bq Er ENOTDIR パスの構成要素中にディレクトリ以外のものが含まれています。 .It Bq Er ENAMETOOLONG パス名の構成要素が 255 文字を越えているか、 またはパス名全体が 1023 文字を越えています。 .It Bq Er ENAMETOOLONG インタプリトされるスクリプトを起動するときに、 インタプリタの名前が .Dv MAXSHELLCMDLEN 文字を越えています。 .It Bq Er ENOENT 新しいプロセスファイルが存在しません。 .It Bq Er ELOOP パス名を変換するときに検出されたシンボリックリンクが多すぎます。 .It Bq Er EACCES 指定されたパスには、検索が許可されていないディレクトリが含まれています .It Bq Er EACCES 新しいプロセスファイルが通常のファイルではありません。 .It Bq Er EACCES 新しいプロセスファイルは、実行が許可されていません。 .It Bq Er ENOEXEC 新しいプロセスファイルに適切なアクセス許可がありますが、 ヘッダのマジック番号が無効です。 .It Bq Er ETXTBSY 新しいプロセスファイルは純粋な手続き (共有テキスト) ファイルで、 現時点で他のプロセスによって書込みまたは読取り用にオープンされています。 .It Bq Er ENOMEM 新しいプロセスは、許された .Pq Xr getrlimit 2 で課された最大値 以上の仮想メモリを必要とします。 .It Bq Er E2BIG 新しいプロセスの引数リストのバイト数がシステムの課した上限を 越えています。 この上限は、 .Xr sysctl 3 の MIB 変数 .Dv KERN_ARGMAX により指定されます。 .It Bq Er EFAULT 新しいプロセスファイルは、ヘッダ内のサイズ値で 示されるほど長くはありません。 .It Bq Er EFAULT .Fa path , .Fa argv , または .Fa envp 引数が正しくないアドレスを指しています。 .It Bq Er EIO ファイルシステムから読み取る間に入出力エラーが発生しました。 .El .Sh 警告 スーパユーザでないものに対して .Em setuid されたプログラムが、実 .Em uid が ``root'' の時に実行された場合、プログラムは部分的に スーパユーザの権限を持ちます。 .Sh 関連項目 .Xr ktrace 1 , .Xr _exit 2 , .Xr fork 2 , .Xr execl 3 , .Xr exit 3 , .Xr sysctl 3 , .Xr a.out 5 , .Xr elf 5 , .Xr environ 7 , .Xr mount 8 .Sh 規格 .Fn execve システムコールは、特定の状況において記述子 0, 1 そして/または 2 を 再度オープンする他は、 .St -p1003.1-2001 に適合しています。 将来規格が更新される際には、このような動作を要求することが期待されており、 権限を持たないプロセスに対しても、これがデフォルトとなるかもしれません。 .\" NB: update this caveat when TC1 is blessed. インタプリトされるプログラムの実行をサポートしているのは、拡張です。 .Sh 歴史 .Fn execve システムコールは .Bx 4.2 で登場しました。