Estoy tratando de entender cómo puedo hacer que mi programa sea un daemon.So algunas cosas que encontré son, en general, un programa realiza los siguientes pasos para convertirse en un demonio:cómo hacer que un demonio proceso
- Llama al
fork()
. En el elemento principal, llame al
exit()
. Esto garantiza que el padre original (el abuelo del daemon ) está satisfecho de que su hijo terminó, que el padre del daemon no está ejecutando y que el daemon no es un líder del grupo de proceso. Este último punto es un requisito para completar con éxito el próximo paso.Llama al
setsid()
, dando al daemon un nuevo grupo de proceso y sesión, ambos de que lo tienen como líder. Esto también garantiza que el proceso no tenga asociado el terminal de control (ya que el proceso acaba de crear una nueva sesión, y no asignará el uno).Cambie el directorio de trabajo al directorio raíz a través del
chdir()
. Esto se hace porque el directorio de trabajo heredado puede estar en cualquier parte del sistema de archivos. Los daemons tienden a ejecutarse durante el tiempo de actividad del sistema, y no desea para mantener abierto un directorio aleatorio, y así evitar que un administrador desmonte el sistema de archivos que contiene ese directorio.Cierre todos los descriptores de archivos.
- Abra los descriptores de archivos 0, 1 y 2 (entrada estándar, salida estándar y error estándar) y redirigirlos a
/dev/null
.
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>
int main (void)
{
pid_t pid;
int i;
/* create new process */
pid = fork ();
if (pid == -1)
return -1;
else if (pid != 0)
exit (EXIT_SUCCESS);
/* create new session and process group */
if (setsid () == -1)
return -1;
/* set the working directory to the root directory */
if (chdir ("/") == -1)
return -1;
/* close all open files--NR_OPEN is overkill, but works */
for (i = 0; i < NR_OPEN; i++)
close (i);
/* redirect fd's 0,1,2 to /dev/null */
open ("/dev/null", O_RDWR);
/* stdin */
dup (0);
/* stdout */
dup (0);
/* stderror */
/* do its daemon thing... */
return 0;
}
Puede alguien darme un enlace al código fuente existente de algún programa como Apache para que pueda entender este proceso con mayor profundidad.
Puede obtener fuentes de Apache [aquí] (http://httpd.apache.org/download.cgi). – nmichaels
Quizás [daemon (3)] (http://linux.die.net/man/3/daemon) podría ser útil. Dice básicamente que la funcionalidad necesaria ya está implementada. – Vlad
@nmichaels gracias por su mensaje, de hecho, estoy buscando solo aquellas líneas que lo conviertan en un daemon.Apache no específicamente. Así que si hay algún sitio en línea será más fácil que descargar la fuente completa. –