https://unix.stackexchange.com/a/436631/674から
ファイル
/proc/$$/environ
...は環境への変更を反映していませんがexec
、プロセスによって編集されたときにプログラムが受け取ったものを報告するだけです。
APUEから:
各プログラムには、環境リストも渡されます。引数リストと同様に、環境リストは文字ポインタの配列であり、各ポインタにはnullで終了するC文字列のアドレスが含まれています。ポインタの配列のアドレスは、グローバル変数に含まれています
environ
。extern char **environ;
特定の環境変数へのアクセスは、通常、environ変数ではなく、セクション7.9で説明されている
getenv
andputenv
関数を介して行われます。ただし、環境全体を調べるには、environ
ポインターを使用する必要があります。
ある/proc/$$/environ
グローバル変数とenviron
相互に、または互いに矛盾から独立しましたか?
経由でアクセスされる文字列environ
も環境への変更を反映していませんが、受信した環境を報告するだけexecve()
ですか?
または、を介しenviron
てアクセスされる文字列は、常にgetenv
最新の環境文字列を取得するように、常にそれらへの変更を反映しますか?
経由でアクセスされる文字列getenv
は常に変更を反映し、常に最新ですか?
ありがとう。
/proc/$$/environ
と変数environ
は独立しています。environ
は環境への変更を反映します。実際、environ
環境変数がを介して環境に追加されると、のポインタの値も変更されますputenv()
(ただし、これは実装の詳細です)。
システムコールレベルとライブラリレベルを区別する必要があります。システムコールレベルでは、環境に関連する唯一のメカニズムはenvp
、execve
コールへの引数です。このパラメーターにはname=value
、新しいプログラムの環境を構成するペアが含まれていることが期待されます。この環境は新しいプロセスのスタックにコピーされ、そこでユーザースペースのスタートアップコードがそれを取得できます。
図書館レベルでは、
environ
環境のコピーを指すグローバル変数getenv()
とputenv()
環境の調査と変更のためexec*
関数のファミリー(を含まないexecve
)environ
exec*
ライブラリ関数は、最終的に呼び出すexecve
システムコールを。 変数は、スタック上の環境を指していません。 代わりに、 変数が設定される 前に環境がプロセスヒープにコピーされます (これも実装の詳細です)。 environ
environ
なぜ/proc/$$/environ
環境の変化を反映しないのですか?/proc/$$/environ
はカーネルによって提供される仮想ファイルであり、カーネルには、ユーザープロセスのアドレス空間でこの低レベルで何が起こっているかを知る方法がありません。カーネルはenviron
変数を認識しておらず、環境を格納するためにプロセスが使用するデータ構造を認識していません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加