
プログラムに環境への参照がない場合、getenv(3)などの関数はどのように環境にアクセスできますか?
答え1
あなたのプログラムには環境への参照はありませんが、コピーそれは。
コマンドライン引数と環境文字列(システムコールexecve(2)
に渡されるとき)は一緒に圧縮され、プロセスのアドレス空間にコピーされます[1]。
一般的な実装[2]では、次の2つのポインタリスト(NULL
パラメータリストと環境を表します)_start
main()
char **environ
グローバル変数を後者の先頭に移動します。
このgetenv(3)
関数は単にリストを見て、environ
各項目を順番に比較します。
一部の新しいエントリを環境に追加する必要がある場合(例:)、setenv(3)
リストenviron
は他の場所に再配置されます。
[1] Linuxでは、パラメータリストと環境変数のアドレスはフィールド48と50でアクセスできます。/proc/PID/stat
を参照してください。procfs(5)
[2] glibcでは_start
スタックの一番上をargc
指してポップアップします。argv
__libc_start_main
__environ
(のエイリアスenviron
)をに設定しますargv + argc + 1
。