背景、殭屍、守護程序和沒有 ctty - 這些概念有聯繫嗎?
這些過程概念是如何联系在一起的-
background
、zombie
和?daemon``without controlling terminal
我覺得它們在某種程度上很接近,尤其是通過
controlling terminal
.更新#1:例如(我不知道這是不是真的)
background
—zombie
前台程序不能成為zombie
,因為zombie
是一個沒有父程序的後台程序daemon
—without ctty
所有daemons
執行都沒有ctty
,但並非所有程序ctty
都沒有daemons
background
—daemon
可以background process
檢索到再次互動執行,daemon is not
zombie
——有無without ctty
依附無所謂zombie``ctty
background
—在他們擁有without ctty
的processes
時候發送到後台,如果從他們那裡拿走,ctty
就會變成守護程序或死亡ctty
簡而言之,加上鍊接。
殭屍
已退出/終止的程序,但其父程序尚未確認終止(使用
wait()
系統呼叫)。死程序保存在程序表中,以便它們的父程序可以被告知其子程序正在退出,以及它們的退出狀態。通常,fork 子程序的程序也會在它們退出時讀取它們的退出狀態,因此只有當父程序停止或出現故障時,您才會看到殭屍。看:
控制終端、會話、前台、後台
這些與在終端上執行的 shell 上下文中的作業控制有關。使用者登錄,會話啟動,綁定到終端(控制終端)並啟動外殼。然後,shell 執行程序並按照使用者的意願將它們發送到前台和後台(
&
在啟動程序時使用^Z
,使用fg
、 和停止它bg
)。如果從終端讀取或寫入,後台程序將停止;^C
如果在終端上被擊中,前台的程序會收到中斷信號。(處理這些信號的是核心的終端驅動程序,shell 控制將哪個程序(組)發送到前台或後台。看:
守護程序
作為守護程序執行的程序通常不應綁定到任何特定終端(或登錄會話或外殼)。它不應該有一個控制終端,這樣如果終端關閉它就不會接收到信號,而且通常也不希望它在終端上進行 I/O。從命令行啟動守護程序需要打破與終端的所有聯繫,即啟動一個新會話(在上面的作業控制意義上)以擺脫控制終端,並關閉終端的文件句柄。當然
init
,登錄會話之外的從、systemd 或類似的東西開始不會有這些聯繫。由於守護程序沒有控制終端,它不受作業控制,並且在作業控制意義上處於“前台”或“後台”並不適用。此外,守護程序通常會在它們退出時重新成為其父級
init
,因此您通常不會將它們視為殭屍。看: