プロセスの現在の環境変数

プロセスの現在の環境変数

この質問には以下が含まれます。この回答

子プロセスを作成して初期環境変数を確認して、プロセスの現在の(初期ではない)環境変数を取得できますか?

アイデアは、子プロセスの初期環境が親プロセスの現在の環境から継承されることです。

ベストアンサー1

execve環境は、引数リストと同様に、システムコールを介して渡される文字列のリストです。期間。アプリケーションが受信した文字列のリストを処理する方法は、アプリケーションによって異なります。

慣例に基づいて、このリストは通常​​引数リストとは異なります。プログラムは、受信した環境変数のリストを記憶し、他のコマンドを実行するときに同じ環境変数を再利用することがよくあります。

これを行うのに役立つCライブラリ関数があります。環境は変数として提供され、、、、、、、、environ...getenv実行コマンド中(追跡中の変数を使用して呼び出されます)setenvputenvexecvpexeclsystempopenenvironexecveenviron

これで、アプリケーションはこのAPIを使用する必要はありません。彼らは独自の方法を使用して環境変数のリストを管理できます。たとえば、シェルは環境変数をシェル変数にマップし、 putenv/setenv libc 関数を使用しないことがあります。連想配列などがperlあります。%ENV

常にgdbプロセスに接続を使用して呼び出すことができますが(libcに動的に接続されていると仮定)、コマンドに接続すると、他のコマンドと同じ環境を取得して独自の方法で実行できるsystem("env > /tmp/some-file")という保証はありません。env(例:シェルを考えてください)。 (また、system()シェルが起動され(コマンドラインが解釈されている)、シェルは起動時に環境を変更できます(例:try env -i sh -c env)。

$ sleep 100 &
[1] 17098
$ gdb --pid=$! /bin/sleep
[...]
(gdb) p environ[0]
$1 = 0x7fffd722d227 "STY=7498.pts-0.hostname"
(gdb) p environ[1]
$2 = 0x7fffd722d245 "TERM=screen-bce"
(gdb) call system("env > /tmp/some-file")
$4 = 0
(gdb) detach
Detaching from program: /bin/sleep, process 17098
(gdb) quit
$ cat /tmp/some-file
GNOME_KEYRING_PID=6850
SSH_AGENT_PID=6844
SHLVL=1
[...]

おすすめ記事