2011-03-21 13 views
64

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

  1. Llama al fork().
  2. 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.

  3. 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).

  4. 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.

  5. Cierre todos los descriptores de archivos.

  6. 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.

+2

Puede obtener fuentes de Apache [aquí] (http://httpd.apache.org/download.cgi). – nmichaels

+7

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

+0

@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. –

Respuesta

13

Si está buscando un enfoque limpio, por favor considere usar el estándar int daemon(int nochdir, int noclose);. La página del hombre es bastante simple y se explica por sí misma. man page. Una API bien probada supera con creces nuestros propios estándares de implementación de portabilidad y estabilidad.

+0

Me alegro de que sea una * respuesta * ahora, en lugar de estar oculta en los comentarios. Tal vez puedas desarrollarlo un poco: enlaza con el estándar (o mejor aún, un enlace a un tutorial o un ejemplo). – RJHunter

+2

@deadbeef Esa respuesta es mucho mejor que la simple [_link only_ answers] (http://meta.stackoverflow.com/questions/323508/what-to-do-with-broken-but-highlyupupoted-link-only -respuestas) que estuvieron presentes antes. Pero aunque también es bastante parecido a un _link only_ (de todos modos, consideraría que el enlace dado es mucho más estable). Intentaría mejorar la respuesta, dando una muestra de código corto (especialmente porque no hay ninguno en la página man vinculada), o citando la sinopsis. –

+2

Tenga en cuenta que la función [daemon] (http://man7.org/linux/man-pages/man3/daemon.3.html) es ** no ** compatible con POSIX. –

0

En Linux, se puede hacer fácilmente usando.

main() 
{ 

daemon(0,0); 
while(1) 
{ 
sleep(10) 
/*do something*/ 
} 

} 
Cuestiones relacionadas