La otra respuesta es clara y técnicamente correcta (y por eso subí en consecuencia).
Otra respuesta es: "No, no escriba el código que se demoniza a sí mismo".
usar en su lugar un marco de supervisión del proceso (como daemontools o runit o launchd) que se encarga de esto para usted. El servidor UNIX tradicional es autodestructivo y, como tal, se preocupa por muchas cosas: directorio de trabajo actual, grupo de procesos y independencia de sesión, máscaras de señal y disposición, raíz del sistema de archivos, privilegios, umask, descriptores de archivos abiertos, etc.
Sin embargo, la mayoría o todos estos atributos de proceso se heredan a través de exec()
, lo que significa que un proceso de servidor normalmente puede "nacer" con el grupo de proceso deseado, directorio de trabajo, raíz, etc. Hay poca necesidad de hacer todo usted mismo , aunque a menudo tendrá que administrar las operaciones privilegiadas y la revocación de privilegios usted mismo.
(De hecho, yo diría que hay un riesgo a largo plazo al escribir programas de autodiagnóstico. Las rutinas repetitivas de "fondo" se copian y pegan, se transfieren apresuradamente y el programador pasa tiempo en el código auxiliar en lugar de en el principal propósito del programa.)
Creo que parte de la razón es que no se espera que un daemon escriba la salida o la entrada de lectura. Si tuviera que comenzar, p. un servidor HTTP en una sesión SSH, no esperaría salida de advertencia aleatoria más adelante en la sesión. –
@JohnChadwick Lo que estás diciendo es de hecho una de las cosas que quieres hacer mientras te transformas en un daemon, pero lo logras al cerrar stdin, stdout y stderr. Se desconecta del terminal para evitar ciertas señales (ver respuestas a continuación). –
¿Puedes "dejar de aceptar" mi respuesta y aceptar @ AdamZalcman's en su lugar? Él hace un trabajo mucho mejor que yo. Y él tiene toda la razón sobre setsid(), deberías usar eso. – fge