Linux
程序的目前環境變數
這個問題與這個答案有關。
是否可以通過創建子程序並檢查其初始環境變數來獲取程序的目前(非初始)環境變數?
這個想法是子程序的初始環境繼承自父程序的目前環境。
環境是通過系統呼叫傳遞的字元串列表
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 [...]