Cライブラリは環境変数にどのようにアクセスしますか?

Cライブラリは環境変数にどのようにアクセスしますか?

プログラムに環境への参照がない場合、getenv(3)などの関数はどのように環境にアクセスできますか?

ベストアンサー1

あなたのプログラムには環境への参照はありませんが、コピーそれは。

コマンドライン引数と環境文字列(システムコールexecve(2)に渡されるとき)は一緒に圧縮され、プロセスのアドレス空間にコピーされます[1]。

一般的な実装[2]では、次の2つのポインタリスト(NULLパラメータリストと環境を表します)_startmain()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

おすすめ記事