L'altra risposta è chiara e tecnicamente corretta (e quindi upvoted conseguenza).
Un'altra risposta è: "No, non scrivere il codice che si daemonizes."
usare al posto di un quadro di supervisione processo (come daemontools o runit o launchd) che si occupa di questo per voi.
Il server UNIX tradizionale è auto-daemonizing, e come tale si agita più di molte cose: la directory di lavoro corrente, gruppo di processi e l'indipendenza della sessione, maschere di segnale e la disposizione, radice di filesystem, privilegi, umask, descrittori di file aperti, ecc
Tuttavia, la maggior parte o tutti questi attributi di processo sono ereditati attraverso un exec()
, il che significa che un processo server può essere generalmente "nato" con il gruppo di processi desiderato, la directory di lavoro, root, ecc. Non c'è molto bisogno di fare tutto da soli , anche se spesso dovrai ancora gestire le operazioni privilegiate e ottenere la revoca dei privilegi.
(Anzi, direi non c'è rischio a lungo termine per iscritto programmi di auto-daemonizing. Boilerplate "backgrounding" routine vengono copiati e incollati e frettolosamente porting ed estese, e il programmatore passa il tempo sul codice accessorio piuttosto che sul scopo principale del programma.)
penso che parte della ragione è che un demone non si prevede di scrivere l'output o di leggere l'input. Se dovessi iniziare, ad es. un server HTTP su una sessione SSH, non ti aspetteresti un avviso di avvertimento casuale più avanti nella sessione. –
@JohnChadwick Quello che stai dicendo è infatti una delle cose che vuoi fare, mentre trasformarsi in un demone, ma a raggiungere questo obiettivo con la chiusura stdin, stdout e stderr. Si scollega dal terminale per evitare determinati segnali (vedere le risposte di seguito). –
Puoi "annullare" la mia risposta e accettare invece @ AdamZalcman's? Fa un lavoro molto migliore di me. E ha pienamente ragione su setsid(), dovresti usarlo. – fge