から引用ウィキペディア:
デフォルトでは、プロセスが作成されると、親プロセスの複製環境が継承されます。子を作るときに親が明示的に変更したことに加えて。 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
。)
答え2
APIは以下を指します。exec
C
他のプロセスを実行するために使用される関数系列です。
プロセスが別のプロセスを開始する一般的な順序は次のとおりです。fork
、作成したばかりの子からexec
関数の1つを呼び出します。
との間のfork
サブexec
プロセスでは、ターゲット実行可能ファイルが起動する前に環境が変更される可能性があります。
また、呼び出しプロセスexecle
をexecvpe
ターゲット環境に直接渡すこともできます。
execle
とが使用されておらず、execvpe
子呼び出しfork
とexec
子呼び出しの間で環境が変更されない場合は、一般規則が適用されます。
シェルの例は、シェルの子の環境を変更する方法を示すために設計されています。上記の「トリック」の一部を使用しないと、シェルでこれを行うことはできません。すべてのサブプロセスは現在のシェル環境の正確なコピーを取得します。