Ściśle mówiąc, double-fork nie ma nic wspólnego z wychowywaniem demona jako dziecka init
. Wszystko, co jest potrzebne do ponownego wychowania dziecka, to to, że rodzic musi wyjść. Można to zrobić za pomocą tylko jednego widelca. Również samo wykonanie podwójnego rozwidlenia nie powoduje ponownego zrobienia procesu demona init
; rodzic demona musi wyjść. Innymi słowy, rodzic zawsze kończy pracę podczas rozwidlania odpowiedniego demona, aby proces demona był ponownie rodzicielski init
.
Dlaczego więc podwójny widelec? POSIX.1-2008 Sekcja 11.1.3, " Terminal sterujący ", zawiera odpowiedź (podkreślenie dodane):
Terminal sterujący sesją jest przydzielany przez lidera sesji w sposób określony w implementacji. Jeśli lider sesji nie ma terminala sterującego i otwiera plik urządzenia terminala, który nie jest już skojarzony z sesją bez użycia O_NOCTTY
opcji (zobacz open()
), definiowane jest w implementacji, czy terminal stanie się terminalem sterującym lidera sesji. Jeśli proces, który nie jest liderem sesji, otwiera plik terminala, lub O_NOCTTY
opcja jest używana na open()
, to terminal ten nie powinien stać się terminalem kontrolującym proces wywołujący .
To mówi nam, że jeśli proces demona robi coś takiego ...
int fd = open("/dev/console", O_RDWR);
... wtedy proces demona może zostać przyjęty /dev/console
jako terminal sterujący, w zależności od tego, czy proces demona jest liderem sesji oraz w zależności od implementacji systemu. Program może zagwarantować, że powyższe wywołanie nie uzyska terminala sterującego, jeśli program najpierw upewni się, że nie jest on liderem sesji.
Normalnie, podczas uruchamiania demona, setsid
jest wywoływana (z procesu potomnego po wywołaniu fork
) w celu odłączenia demona od jego kontrolującego terminala. Jednak wywołanie setsid
oznacza również, że proces wywołujący będzie liderem sesji nowej sesji, co pozostawia otwartą możliwość, że demon mógłby ponownie uzyskać kontrolujący terminal. Technika podwójnego rozwidlenia zapewnia, że proces demona nie jest liderem sesji, co gwarantuje, że wywołanie open
, jak w powyższym przykładzie, nie spowoduje, że proces demona ponownie przejmie kontrolujący terminal.
Technika podwójnego widelca jest nieco paranoiczna. Może to nie być konieczne, jeśli wiesz, że demon nigdy nie otworzy pliku urządzenia terminala. Ponadto w niektórych systemach może nie być konieczne, nawet jeśli demon otwiera plik urządzenia terminala, ponieważ to zachowanie jest zdefiniowane w implementacji. Jednak jedną rzeczą, która nie jest zdefiniowana w ramach implementacji, jest to, że tylko lider sesji może przydzielić terminal sterujący. Jeśli proces nie jest liderem sesji, nie może przydzielić kontrolującego terminala. Dlatego, jeśli chcesz być paranoikiem i być pewnym, że proces demona nie może przypadkowo uzyskać kontrolującego terminala, niezależnie od jakichkolwiek specyfikacji zdefiniowanych w implementacji, niezbędna jest technika podwójnego rozwidlenia.