Cómo ejecutar como proceso demonio en un sistema Linux
Puntos clave al escribir un programa demonio:
(1) Deje que el programa se ejecute en segundo plano. El método consiste en llamar a fork() para generar un proceso hijo y luego hacer que el proceso padre salga.
(2) Llame a setsid() para crear una nueva sesión. Los terminales de control, las sesiones de inicio de sesión y los grupos de procesos generalmente se heredan del proceso principal. El proceso demonio puede deshacerse de ellos y no verse afectado llamando a setsid() para convertir el proceso en un líder de grupo de sesión. Después de que la llamada a setsid() sea exitosa, el proceso se convierte en el nuevo líder del grupo de sesión y el líder del grupo de procesos, y se separa de la sesión de inicio de sesión, el grupo de procesos y el terminal de control originales.
(3) Prohibir que el proceso vuelva a abrir la terminal de control. Después de los pasos anteriores, el proceso se ha convertido en un líder de sesión sin terminal, pero puede volver a solicitar la apertura de una terminal. Para evitar que esto suceda, puede hacer que el proceso ya no sea el líder de la sesión. Cree un nuevo proceso hijo a través de fork() nuevamente, lo que provocará que el proceso que llamó a fork salga.
(4) Cerrar los descriptores de archivos que ya no sean necesarios. El proceso hijo hereda los descriptores de archivos abiertos del proceso padre. Si no se cierra, se desperdiciarán recursos del sistema, el sistema de archivos donde se encuentra el proceso no se podrá desmontar y se producirán errores impredecibles. Primero obtenga el valor de descriptor de archivo más alto, luego use un programa de bucle para cerrar todos los descriptores de archivo desde 0 hasta el valor de descriptor de archivo más alto.
(5) Cambie el directorio actual al directorio raíz.
(6) La máscara de creación de archivos heredada por el proceso hijo del proceso padre puede denegar ciertos permisos. Para evitar esto, use unmask(0) para borrar la palabra de máscara a cero.
(7) Procesar la señal SIGCHLD. Para los procesos del servidor, cuando llega una solicitud, a menudo se genera un proceso hijo para manejar la solicitud. Si el proceso padre no espera a que finalice el proceso hijo, el proceso hijo se convertirá en un proceso zombie (zombi) y ocupará recursos del sistema. Si el proceso principal espera a que finalice el proceso secundario, aumentará la carga sobre el proceso principal y afectará el rendimiento de concurrencia del proceso del servidor. En Linux, simplemente puede configurar el funcionamiento de la señal SIGCHLD en SIG_IGN. De esta forma, no se generará ningún proceso zombie cuando finalice el proceso hijo.