2012-09-14 72 views
1

不久前,我想知道這個問題:爲什麼當你在Linux上關閉一個終端並且沒有傳遞給「init」進程(使用pid 1)時,所有進程都會被終止? 因爲所有的子進程在父進程終止之後被「init」進程採用。 請幫助我理解差異和推理中的錯誤。當終端會話結束時,爲什麼所有進程都被終止?

還有: 如果可能,那麼我們可以使用系統調用來阻止這種情況發生嗎?我想,對於這個程序需要使用setsid(),但實際上這是不正確的。

回答

1

爲什麼在Linux上接近終端上他所有的進程將終止,但 不會傳遞到「初始化」過程(與PID 1)

的進程,以便內核發送他們正在失去他們的控制終端一個SIGHUPSIGHUP的默認操作是終止該過程。

+0

我可以在我的程序模擬嗎? 哪個系統調用用於此? – Simplex

+0

@Simplex你需要'setsid'。 – cnicutar

+0

但setsid()返回-1。 我使用setsid(),並使用fork()創建了幾個進程。 – Simplex

2

正如cnicutar解釋,這是由於與控制終端相關的進程組中發送給所有進程SIGHUP。您可以爲此信號安裝處理程序或完全忽略它。對於任意程序,您可以使用專門爲此設計的nohup實用程序啓動它們。

您也可以將過程放在沒有控制終端的新過程組中。

相關問題