Linux

程序的目前環境變數

  • July 17, 2013

這個問題與這個答案有關。

是否可以通過創建子程序並檢查其初始環境變數來獲取程序的目前(非初始)環境變數?

這個想法是子程序的初始環境繼承自父程序的目前環境。

環境是通過系統呼叫傳遞的字元串列表execve,就像參數列表一樣。時期。應用程序如何處理它接收到的字元串列表取決於應用程序。

現在,按照慣例,該列表的使用通常與參數列表不同。程序通常會記住它們接收到的環境變數列表,並在執行另一個命令時重複使用這些環境變數。

他們有 C 庫函式來幫助他們做到這一點:環境作為變數提供,您可以使用、、和函式environ來檢索和修改該列表(它收到的環境變數列表的副本),, , …在執行命令時使用該變數(呼叫他們正在跟踪的)。getenv``setenv``putenv``execvp``execl``system``popen``environ``execve``environ

現在應用程序不必使用該 API。他們可以使用自己的方式來管理環境變數列表。例如,shell 將環境變數映射到 shell 變數,並且可能不使用 putenv/setenv libc 函式。perl有它的%ENV關聯數組等等。

您始終可以使用gdb附加到程序並使其呼叫system("env > /tmp/some-file")(假設它們動態連結到 libc),但是如果您附加到的命令,您無法保證env將獲得與另一個命令相同的環境以自己的方式執行它(例如考慮 shell)。(另請注意,system()啟動一個 shell(以解釋命令行)並且 shell 可能會在啟動時改變它們的環境(例如嘗試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
[...]

引用自:https://unix.stackexchange.com/questions/83181