Linux
在“execve”呼叫期間保留了非特權程序的哪些屬性?
我正在教授作業系統課程,並試圖圍繞
fork
/execve
技術來創建新流程。我目前的理解是,fork 會完整複製舊程序,建立新的 PID 和父/子關係,但除此之外幾乎沒有其他作用。
另一方面,在創建子程序後,它會執行 execve 以將其大部分記憶體替換為新程序。例如,程式碼、堆棧和堆被完全替換,並作為一個新程序從頭開始。
但並非所有東西都在新流程中被替換。子程序繼承文件描述符(允許在 execve 之前設置管道)、程序 ID (PID) 和使用者 ID (UID) 以及一些權限(手冊頁)。
我想不被 execve 呼叫替換的屬性的完整列表很長,但是還有像我上面提到的那些我缺少的其他關鍵屬性嗎?
由於我們正在專門討論 Linux(至少,我認為這就是您想要的,因為您使用了linux標籤),所以
fork
和execve
manpages 是適當的參考;他們列出了所有未保留的屬性。大多數這種行為是由 POSIX 指定的,但也有一些 Linux 特性。手冊頁沒有列出保留的屬性*,*而是關注那些沒有保留的屬性:
期間保留所有程序屬性
execve()
,但以下情況除外:等等
我不會嘗試通過列出所有保留的屬性來回答您的問題。但是,我將指出一個保留的關鍵屬性,但您沒有列出:忽略和預設信號被保留在
execve
. 這意味著父母可以忽略一個信號(至少是可以忽略的信號),並且該行為將傳播給任何孩子。這就是允許nohup
工作的原因。您可以在The Linux Programming Interface的第 28.4 節中找到程序屬性的完整列表,
exec()
以及對它們發生了什麼的解釋。fork()