A rigor di termini, il doppio fork non ha nulla a che fare con il ri-genitorialità del demone come figlio di init
. Tutto ciò che è necessario per ricoprire il genitore è che il genitore debba uscire. Questo può essere fatto con una sola forcella. Inoltre, fare un doppio fork da solo non riconduce il processo daemon init
; il genitore del demone deve uscire. In altre parole, il genitore esce sempre quando si biforca un demone appropriato in modo che il processo del demone venga riprogrammato init
.
Allora perché la doppia forcella? POSIX.1-2008 Sezione 11.1.3, " Il terminale di controllo ", ha la risposta (enfasi aggiunta):
Il terminale di controllo per una sessione è assegnato dal leader della sessione in un modo definito dall'implementazione. Se un leader di sessione non ha un terminale di controllo e apre un file di dispositivo terminale che non è già associato a una sessione senza utilizzare l' O_NOCTTY
opzione (vedere open()
), viene definito dall'implementazione se il terminale diventa il terminale di controllo del leader di sessione. Se un processo che non è un leader della sessione apre un file di terminale, o l' O_NOCTTY
opzione è usata su open()
, quel terminale non diventerà il terminale di controllo del processo di chiamata .
Questo ci dice che se un processo daemon fa qualcosa del genere ...
int fd = open("/dev/console", O_RDWR);
... quindi il processo daemon potrebbe essere acquisito /dev/console
come terminale di controllo, a seconda che il processo daemon sia un leader della sessione e in base all'implementazione del sistema. Il programma può garantire che la chiamata di cui sopra non acquisirà un terminale di controllo se il programma garantisce innanzitutto che non è un leader della sessione.
Normalmente, quando si avvia un demone, setsid
viene chiamato (dal processo figlio dopo aver chiamato fork
) per dissociare il demone dal suo terminale di controllo. Tuttavia, chiamare setsid
significa anche che il processo di chiamata sarà il leader della sessione della nuova sessione, il che lascia aperta la possibilità che il demone possa riacquistare un terminale di controllo. La tecnica a doppio fork assicura che il processo daemon non sia il leader della sessione, il che garantisce che una chiamata a open
, come nell'esempio sopra, non comporterà il processo daemon che riacquista un terminale di controllo.
La tecnica della doppia forcella è un po 'paranoica. Potrebbe non essere necessario se sai che il demone non aprirà mai un file del dispositivo terminale. Inoltre, su alcuni sistemi potrebbe non essere necessario anche se il demone apre un file del dispositivo terminale, poiché tale comportamento è definito dall'implementazione. Tuttavia, una cosa che non è definita dall'implementazione è che solo un leader di sessione può allocare il terminale di controllo. Se un processo non è un leader di sessione, non può allocare un terminale di controllo. Pertanto, se si desidera essere paranoici ed essere certi che il processo daemon non possa inavvertitamente acquisire un terminale di controllo, indipendentemente da eventuali specifiche definite dall'implementazione, la tecnica del doppio fork è essenziale.