不久前,我想知道這個問題:爲什麼當你在Linux上關閉一個終端並且沒有傳遞給「init」進程(使用pid 1)時,所有進程都會被終止? 因爲所有的子進程在父進程終止之後被「init」進程採用。 請幫助我理解差異和推理中的錯誤。當終端會話結束時,爲什麼所有進程都被終止?
還有: 如果可能,那麼我們可以使用系統調用來阻止這種情況發生嗎?我想,對於這個程序需要使用setsid()
,但實際上這是不正確的。
不久前,我想知道這個問題:爲什麼當你在Linux上關閉一個終端並且沒有傳遞給「init」進程(使用pid 1)時,所有進程都會被終止? 因爲所有的子進程在父進程終止之後被「init」進程採用。 請幫助我理解差異和推理中的錯誤。當終端會話結束時,爲什麼所有進程都被終止?
還有: 如果可能,那麼我們可以使用系統調用來阻止這種情況發生嗎?我想,對於這個程序需要使用setsid()
,但實際上這是不正確的。
爲什麼在Linux上接近終端上他所有的進程將終止,但 不會傳遞到「初始化」過程(與PID 1)
的進程,以便內核發送他們正在失去他們的控制終端一個SIGHUP
。 SIGHUP
的默認操作是終止該過程。
正如cnicutar解釋,這是由於與控制終端相關的進程組中發送給所有進程SIGHUP
。您可以爲此信號安裝處理程序或完全忽略它。對於任意程序,您可以使用專門爲此設計的nohup
實用程序啓動它們。
您也可以將過程放在沒有控制終端的新過程組中。
我可以在我的程序模擬嗎? 哪個系統調用用於此? – Simplex
@Simplex你需要'setsid'。 – cnicutar
但setsid()返回-1。 我使用setsid(),並使用fork()創建了幾個進程。 – Simplex