script - listar servicios linux
cómo hacer un daemon de proceso (2)
Estoy tratando de entender cómo puedo hacer que mi programa sea un daemon. Por lo tanto, algunas cosas que encontré son En general, un programa realiza los siguientes pasos para convertirse en un daemon:
- Llamar a
fork( )
. En el padre, llame a
exit( )
. Esto asegura que el padre original (el abuelo del daemon) está satisfecho de que su hijo terminó, que el padre del daemon ya no se 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 siguiente paso.Llame a
setsid( )
, dándole al daemon un nuevo grupo de proceso y sesión, que lo tienen como líder. Esto también asegura que el proceso no tenga un terminal de control asociado (ya que el proceso acaba de crear una nueva sesión y no asignará uno).Cambie el directorio de trabajo al directorio raíz a través de
chdir( )
. Esto se hace porque el directorio de trabajo heredado puede estar en cualquier parte del sistema de archivos. Los demonios tienden a ejecutarse durante el tiempo de actividad del sistema, y no desea 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 archivo 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 más profundidad?
En Linux, se puede hacer fácilmente usando.
main()
{
daemon(0,0);
while(1)
{
sleep(10)
/*do something*/
}
}
Si está buscando un enfoque limpio, considere usar el daemon estándar de api- int daemon(int nochdir, int noclose);
. La página del hombre es bastante simple y se explica por sí misma. página del hombre Una API bien probada supera con creces nuestros propios estándares de implementación de portabilidad y estabilidad.