から引用ウィキペディア:
デフォルトでは、プロセスが作成されると、親プロセスの複製環境が継承されます。子を作るときに親が明示的に変更したことに加えて。 API レベルでは、これらの変更はフォークと実行の間で行う必要があります。あるいは、bashなどのシェルでenvを間接的に呼び出すことも、ENVIRONMENT_VARIABLE = VALUE表記を使用して特定のコマンド呼び出しの環境変数を変更することもできます。
私は「プロセスが作成されると、親プロセスの冗長環境を継承します」を理解しています。しかし、「子を作成するときに親が明示的に変更したこと」という例外が実際に何を意味するのかを知りたいです。 APIとシェルの例がどのように例外の例になるかはわかりません。
ベストアンサー1
UNIXモデルで別のプログラムを起動するには、2つの基本要素が必要です。
fork()
呼び出しプロセスの(ほぼ)同じコピーを作成します。新しいプロセスを子プロセスと呼び、元のプロセスを親プロセスと呼びます。子プロセスは元のプロセスと同じコードを実行し、同じ権限を持ち、同じ環境を持ち、親プロセスの可変データメモリのコピーを受け取ります。 2つのプロセスの最も明白な違いは、プロセスIDと親プロセスIDが異なることです(サブプロセスのPPIDは親プロセスのPIDです)。execve()
現在のプロセスのコードとデータを実行可能ファイルから読み込まれたコードとデータで置き換えます。このシステムコールは、プロセスの新しい環境をパラメータとして使用します。
ほとんどの高度な機能は、プロセスの現在の環境を中心に構築され配信されfork()
ます。したがって、プロセスが自分の環境を変更したり直接呼び出さない限り、呼び出されたプログラムは呼び出し元プログラムの環境を継承します。execve()
execve()
execve()
シェルは通常、自分が呼び出すプログラムに環境を渡します。環境変数に値を割り当てることで、いつでもシェルの環境を変更できます(foo="some value"
;変数が環境にない場合は呼び出す必要がありますexport foo
)。設定を解除して環境から変数を削除できます(unset foo
)。他の環境変数または追加の環境変数を使用して外部プログラムを起動するには、ショートカット構文を使用できます。
foo="some value" mycommand
ほぼ等しい
(foo="some value"; export foo; exec mycommand)
(括弧は設定範囲を制限しますfoo
。)