Process
改變一個程序的父程序?
是否可以更改程序的父程序?如果是,如何?
例如,
- 如何
screen
設法將會screen
話和在其中執行的程序附加到不同的 shell 程序?父程序是否有變化?- 我似乎聽說過其他改變執行程序的shell程序的方法,但我不記得了。程序的父程序是否也有變化?
- 我以為
disown
對一個程序的父程序的改變,僅僅是因為名字的disown
含義。但我發現這不是真的。- Emacs 客戶端可以附加到不同終端選項卡上的 emacs 伺服器。父程序是否有變化?
程序的父程序 id (ppid) 不能在核心之外更改;沒有 setppid 系統呼叫。核心只會在父程序終止後將 ppid 更改為 (pid) 1 - 如果程序沒有響應父程序終止的信號。為此,該程序需要事先忽略各種信號(
SIGHUP
、SIGTERM
等)。
screen(1)
有一種非常優雅的方式來處理分離和重新連接。當您第一次啟動時screen
,您實際上是在啟動一個使用者界面 (ui),預設情況下它將創建一個守護程序(會話管理器)。這個守護程序沒有與之關聯的終端、一個新的程序組 (setpgrp(2)
)、一個新的會話 ID (setsid(2)
)。守護程序以 身份執行SCREEN
,然後將創建連接到偽終端 (pty
) 的子程序,然後多路復用來自 ptys 和 ui (screen
) 的數據。子程序認為他們正在與一個真正的終端交談。如果 ui
screen
終止,守護程序SCREEN
仍將執行,緩衝數據、處理信號、等待新的 ui 等,因為它是不同的程序組並且在自己的會話中。當您使用新的 ui 重新附加時screen
,守護程序將繼續像以前一樣多路復用。守護程序將繼續執行,直到所有子程序終止、被殺死、遇到致命錯誤或主機重新啟動。