Bash

在 Bash 中執行的新程序如何總是具有相同的環境變數?

  • October 3, 2020

不久前,我正在使用 GDB 探索一個簡單的 C 程序的 ELF 二進製文件。我看到當我printenv在終端中執行時列印的環境變數也出現在我在該終端中執行的 C 程序二進製文件的堆棧頂部。

Bash 如何實際執行一個程序,同時所有環境變數也被添加到新程序的堆棧中?簡而言之,當我執行這樣的程序時,一步一步會發生什麼: ./myprogram

使用execve系統呼叫執行 Linux 程序。execve具有以下簽名:

int execve(const char *filename, char *const argv[], char *const envp[]);

最後一個參數envp用於將環境作為字元串數組傳遞給程序,每個字元串的形式為 key=value。按照慣例,相同的環境從一個程序傳遞到另一個程序,除非呼叫程序對其進行了一些更改。核心安排新程序接收堆棧上的環境,與傳遞程序參數的方式相同。

庫函式execlexeclpexecvexecvp不帶envp參數(但execleandexecvpe函式可以)。這些函式從environ呼叫程序中的全域變數中獲取環境。這樣一個程序使用該execle函式啟動另一個程序就不必擔心傳遞環境,但庫函式會在“幕後”自動完成。

所有提到的庫函式最終都會呼叫系統呼叫,並在參數execve中傳遞環境。envp

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