Açıkçası, çift çatalın daemon'u bir çocuk olarak yeniden ebeveynleştirmekle hiçbir ilgisi yoktur init
. Çocuğu yeniden ebeveynleştirmek için gerekli olan tek şey ebeveynin çıkması gerektiğidir. Bu sadece tek bir çatalla yapılabilir. Ayrıca, çift çatal yapmak kendi başına daemon sürecini yeniden ebeveyn yapmaz init
; arka plan programının ebeveyninin çıkması gerekir . Başka bir deyişle, ebeveyn her zaman uygun bir arka plan programı çatallanırken daemon işleminin yeniden ayrılması için çıkar init
.
Peki neden çift çatal? POSIX.1-2008 Bölüm 11.1.3, " Kontrol Terminali " cevabı vardır (vurgu eklenmiştir):
Bir oturum için kontrol terminali , oturum lideri tarafından uygulama tanımlı bir şekilde tahsis edilir . Bir oturum liderinin kontrol terminali yoksa ve O_NOCTTY
seçeneği kullanmadan bir oturumla ilişkilendirilmemiş bir terminal cihaz dosyası açarsa (bkz. open()
), Terminalin oturum liderinin kontrol terminali olup olmadığı uygulama tarafından tanımlanır. Bir süreç ise değil bir oturum lideri bir terminal dosyasını açar, ya da O_NOCTTY
seçenek kullanılır open()
, daha sonra terminali çağıran sürecin denetim terminali haline görmemesi gerektiğini .
Bu bize bir daemon süreci böyle bir şey yaparsa ...
int fd = open("/dev/console", O_RDWR);
... sonra arka planda çalışan olabilir kazanmak /dev/console
onun terminal kontrol ve arka planda çalışan bir oturum lideri olmasına bağlı olarak ve sistem uygulamaya bağlı olarak. Program, ilk önce bir oturum lideri olmadığından emin olursa, yukarıdaki çağrının bir kontrol terminali edinmeyeceğini garanti edebilir .
Normalde, bir arka plan programı başlatılırken, arka plan programını kontrol eden terminalden setsid
ayırmak için (çağırdıktan sonra alt süreçten fork
) çağrılır . Bununla birlikte, çağrı setsid
, çağrı sürecinin yeni oturumun oturum lideri olacağı anlamına gelir ve bu da arka plan programının kontrol eden bir terminali yeniden kazanma olasılığını açık bırakır. Çift çatal tekniği, daemon işleminin oturum lideri olmamasını sağlar, bu da open
yukarıdaki örnekte olduğu gibi bir çağrının bir daemon işleminin bir kontrol terminalini yeniden kazanmasına neden olmayacağını garanti eder .
Çift çatal tekniği biraz paranoyak. Daemon'un hiçbir zaman bir terminal cihazı dosyası açmayacağını biliyorsanız gerekli olmayabilir . Ayrıca, bazı sistemlerde, bu davranış uygulama tanımlı olduğundan, arka plan programı bir terminal aygıtı dosyası açsa bile gerekli olmayabilir. Ancak, uygulama tanımlı olmayan bir şey, yalnızca bir oturum liderinin kontrol terminalini tahsis edebilmesidir. Bir işlem oturum lideri değilse, denetleyen bir terminal ayıramaz. Bu nedenle, paranoyak olmak ve daemon işleminin, herhangi bir uygulama tanımlı özelliğe bakılmaksızın, yanlışlıkla bir kontrol terminali elde edemeyeceğinden emin olmak istiyorsanız, çift çatal tekniği önemlidir.