Строго кажучи, подвійний вил не має нічого спільного з повторним вихованням демона в дитинстві init
. Все, що потрібно для того, щоб перевчити дитину, це те, що батько повинен вийти. Це можна зробити лише однією виделкою. Крім того, виконання подвійної вилки само по собі не відновлює процес демона init
; батько демона повинен вийти. Іншими словами, батько завжди виходить, коли розпалює належний демон, щоб процес демона був повторно налаштований на init
.
То чому подвійний вилка? POSIX.1-2008 Розділ 11.1.3 " Термінал керування " містить відповідь (наголос додано):
Керуючий термінал для сеансу розподіляється керівником сесії у визначеному реалізацією порядку. Якщо у лідера сеансу немає керуючого терміналу і відкриває файл термінального пристрою, який вже не пов'язаний з сеансом, не використовуючи O_NOCTTY
параметр (див. open()
), Він визначається реалізацією, чи стає термінал контрольним терміналом лідера сеансу. Якщо процес, який не є лідером сеансу, відкриває файл терміналу або використовується O_NOCTTY
параметр open()
, то цей термінал не повинен стати контрольним терміналом процесу виклику .
Це говорить нам, що якщо демон демон робить щось подібне ...
int fd = open("/dev/console", O_RDWR);
... тоді процес демона може набувати /dev/console
свого контрольного терміналу, залежно від того, чи є процес демона лідером сесії та залежно від реалізації системи. Програма може гарантувати, що вищевказаний виклик не придбає контрольний термінал, якщо програма спочатку переконається, що він не є лідером сесії.
Зазвичай при запуску демона setsid
викликається (від дочірнього процесу після дзвінка fork
) для відмежування демона від його керуючого терміналу. Однак виклик setsid
також означає, що процес виклику буде лідером сесії нової сесії, що залишає відкритим можливість того, що демон може знову придбати контрольний термінал. Техніка подвійної вилки забезпечує те, що процес демон не є лідером сесії, що гарантує, що виклик open
, як у наведеному вище прикладі, не призведе до того, що процес демона повторно придбає контрольний термінал.
Техніка подвійної вилки трохи параноїчна. Це може не бути необхідним, якщо ви знаєте, що демон ніколи не відкриє файл термінального пристрою. Крім того, для деяких систем це може бути не потрібно, навіть якщо демон відкриває файл термінального пристрою, оскільки така поведінка визначена реалізацією. Однак одне, що не визначено реалізацією, - це те, що лише керівник сесії може виділити керуючий термінал. Якщо процес не є лідером сеансу, він не може виділити контрольний термінал. Тому, якщо ви хочете бути параноїком і бути впевненим, що демон-процес не може ненавмисно придбати контрольний термінал, незалежно від будь-яких визначених реалізацією специфік, то техніка подвійної вилки є важливою.