Sebenarnya, garpu ganda tidak ada hubungannya dengan mengasuh kembali daemon sebagai anak init
. Semua yang diperlukan untuk menjadi orang tua kembali anak adalah bahwa orang tua harus keluar. Ini dapat dilakukan dengan hanya satu garpu. Selain itu, melakukan double-fork dengan sendirinya tidak menjadi proses ulang daemon init
; orang tua daemon harus keluar. Dengan kata lain, orang tua selalu keluar saat forking daemon yang tepat sehingga proses daemon di-parent kembali init
.
Jadi mengapa garpu ganda? POSIX.1-2008 Bagian 11.1.3, " The Controlling Terminal ", memiliki jawabannya (penekanan ditambahkan):
Terminal pengendali untuk suatu sesi dialokasikan oleh pemimpin sesi dengan cara yang ditentukan implementasi. Jika pemimpin sesi tidak memiliki terminal pengendali, dan membuka file perangkat terminal yang belum dikaitkan dengan sesi tanpa menggunakan O_NOCTTY
opsi (lihat open()
), itu ditentukan implementasi apakah terminal menjadi terminal pengendali pemimpin sesi. Jika suatu proses yang bukan pemimpin sesi membuka file terminal, atau O_NOCTTY
opsi digunakan open()
, maka terminal itu tidak akan menjadi terminal pengendali dari proses panggilan .
Ini memberitahu kita bahwa jika proses daemon melakukan sesuatu seperti ini ...
int fd = open("/dev/console", O_RDWR);
... maka proses daemon mungkin diperoleh /dev/console
sebagai terminal pengendali, tergantung pada apakah proses daemon adalah pemimpin sesi, dan tergantung pada implementasi sistem. Program dapat menjamin bahwa panggilan di atas tidak akan mendapatkan terminal pengendali jika program pertama memastikan bahwa itu bukan pemimpin sesi.
Biasanya, ketika meluncurkan daemon, setsid
dipanggil (dari proses anak setelah memanggil fork
) untuk memisahkan daemon dari terminal pengendali. Namun, panggilan setsid
juga berarti bahwa proses panggilan akan menjadi pemimpin sesi sesi baru, yang membuka kemungkinan bahwa daemon dapat memperoleh kembali terminal pengendali. Teknik garpu ganda memastikan bahwa proses daemon bukan pemimpin sesi, yang kemudian menjamin bahwa panggilan untuk open
, seperti dalam contoh di atas, tidak akan mengakibatkan proses daemon mendapatkan kembali terminal pengendali.
Teknik garpu ganda agak paranoid. Mungkin tidak perlu jika Anda tahu bahwa daemon tidak akan pernah membuka file perangkat terminal. Juga, pada beberapa sistem mungkin tidak diperlukan bahkan jika daemon benar-benar membuka file perangkat terminal, karena perilaku itu didefinisikan oleh implementasi. Namun, satu hal yang tidak didefinisikan implementasi adalah bahwa hanya pemimpin sesi yang dapat mengalokasikan terminal pengendali. Jika suatu proses bukan pemimpin sesi, itu tidak dapat mengalokasikan terminal pengendali. Oleh karena itu, jika Anda ingin menjadi paranoid dan memastikan bahwa proses daemon tidak dapat secara tidak sengaja memperoleh terminal pengendali, terlepas dari implementasi spesifik yang ditentukan, maka teknik garpu ganda sangat penting.