為什麼守護程序沒有關聯的終端?
我對創建 linux 守護程序的慣例有點困惑。人們大多同意使守護程序沒有關聯的終端。此外,在範常式式碼中,程序的父程序通常被殺死,而守護程序重新成為 init 的父程序。我沒有問題理解這是這樣做的方法,但是為什麼?該程序沒有關聯的終端並且是初始化的直接子程序,這有什麼好處?
https://en.wikipedia.org/wiki/SIGHUP
1.程序沒有關聯終端有什麼好處?
在 POSIX 兼容的平台上,SIGHUP(“信號掛斷”)是在程序的控制終端關閉時發送給程序的信號。(它最初是為了通知串列線路掉線的過程而設計的。)
$$ … $$ 預設動作
$$ of SIGHUP $$在符合 POSIX 的系統上是異常終止。
如果我正確理解情況,則有兩種不同的情況。
明顯的情況是,如果您關閉例如 GNOME Terminal 或 之類的終端仿真器
mc
,則會關閉偽終端設備的主端。這個閉包會在偽終端上產生一個掛斷。這會影響從設備。受此終端控制的所有程序都將收到 SIGHUP。這不是上述情況。@JDePB指出第二種情況:如果關閉所有引用終端設備的文件描述符,它也會產生掛斷。也就是說,如果您的守護程序關閉其 tty 的 FD(它應該關閉),然後在其他程序打開 tty 出口的 FD 時,您的守護程序將收到 SIGHUP,即使您的終端模擬器沒有響應並離開偽終端的主端打開。通過清除 HUPCL可以為整個終端設備禁用此功能。
還有
vhangup()
。似乎login
呼叫它是為了嘗試確保上一個會話不會干擾它。或者其他的東西。我並不完全清楚,因為這個呼叫是特定於 Linux 的,並且手冊頁非常非常短。2.並且是直接子init?
如果接收 SIGHUP 的程序是 Unix shell,那麼作為作業控制的一部分,它通常會攔截信號並確保所有停止的程序在將信號發送給子程序(更準確地說,程序組,在 shell 內部表示為一個“工作”),預設情況下會終止它們。