Bash
在 Bash 中執行的新程序如何總是具有相同的環境變數?
不久前,我正在使用 GDB 探索一個簡單的 C 程序的 ELF 二進製文件。我看到當我
printenv
在終端中執行時列印的環境變數也出現在我在該終端中執行的 C 程序二進製文件的堆棧頂部。Bash 如何實際執行一個程序,同時所有環境變數也被添加到新程序的堆棧中?簡而言之,當我執行這樣的程序時,一步一步會發生什麼:
./myprogram
使用
execve
系統呼叫執行 Linux 程序。execve
具有以下簽名:int execve(const char *filename, char *const argv[], char *const envp[]);
最後一個參數
envp
用於將環境作為字元串數組傳遞給程序,每個字元串的形式為 key=value。按照慣例,相同的環境從一個程序傳遞到另一個程序,除非呼叫程序對其進行了一些更改。核心安排新程序接收堆棧上的環境,與傳遞程序參數的方式相同。庫函式
execl
、execlp
、execv
和execvp
不帶envp
參數(但execle
andexecvpe
函式可以)。這些函式從environ
呼叫程序中的全域變數中獲取環境。這樣一個程序使用該execle
函式啟動另一個程序就不必擔心傳遞環境,但庫函式會在“幕後”自動完成。所有提到的庫函式最終都會呼叫系統呼叫,並在參數
execve
中傳遞環境。envp