demonio en el fondo para sistemas Linux

  
creo que con la popularidad de Linux, estamos escribiendo un montón de programas en Linux, especialmente algunos de los programas del servidor se transfieren a Linux lentamente debajo de la barra. Nos encontramos con la inevitable pregunta es cómo hacer su propio proceso de demonio que se ejecute en el arranque del sistema, y ​​será siempre un proceso de fondo. Aquí es escribir un procedimiento de este tipo. El código fuente es el siguiente:
//////////////////////////////init_daemon.c empezar ///////////////////////////////////////////
# include # include

# include
# include # include

/************************************* ********************************
* nombre: * init_daemon.c
propósito: para producir un proceso de fondo
* escribió por: zhoulifa Zhou Lifa
tiempo * fecha: 2006-03-10 01:00:00
* Gracias a: Universidad de Tecnología de Beijing Xiao Hu
)
* Nota: cualquier persona el código puede ser copiado libremente y utilizar estos códigos, por supuesto, incluyendo su uso comercial
* pero por favor siga el GPL
************************ ********************************************* /
vacío init_daemon (void)
{
int pid;
int i;
si (pid = tenedor ())
de salida (0); //es el proceso padre, el final de la matriz
else if (pid < 0)
de salida (1); //tenedor fracasó, salida
//primer proceso hijo, el fondo sigue
setsid (); //proceso hijo se convierta en la primera nuevo líder de la sesión y el proceso de separación y cabeza abajo @
si (pid = tenedor ())
salida (0) y un terminal de control; //primero Proceso, el final de la primera proceso hijo
else if (pid < 0)
de salida (1); //tenedor falló, salida
//es el segundo proceso hijo para continuar
//segundo el niño ya no es un líder de la sesión
for (i = 0; i < nofile; ++ i) //cerrar los descriptores de archivos abiertos
cercanos (I);
chdir (" /tmp "); //cambiar el directorio de trabajo a /tmp
máscara de usuario (0); //restablecer la máscara de creación de archivos
regresar;
}
//////////////////////////////init_daemon.c extremo ///////////////////////////////////////////
anteriormente, esta es una función genérica, puede hacer que su programa para convertirse en un demonio.
Aquí es un programa de prueba:
//////////////////////////////daemontest.c comienzan ///////////////////////////////////////////
# include # include

/*********************************************** **********************
* nombre: * daemontest.c
objetivo: poner a prueba un proceso de fondo
* escribió por: zhoulifa Zhou Lifa
* fecha y hora: 2006-03-10 01:09:00
* Gracias a: Universidad de Tecnología de Beijing bigotes
* Nota: cualquiera puede copiar el código y utilizar estos códigos, por supuesto, incluyendo su negocio utilizar
* pero por favor siga la GPL
************************************** ******************************* /
init_daemon (void); //daemon función de inicialización
signal_reload vacío (señal int)
{
/* SIGUSR1 señal cuando se recibe el programa vuelva a importar todos los parámetros * /
FILE * fp;
time_t t;
if ((fp = fopen (" test.log ", " a ")) > = 0)
{
t = tiempo (0);
fprintf (fp, " I la señal recibida (% d), recargar todos los parámetros en% s \\ n ", señal, asctime (localtime (&t)));
f Cerrar (fp);
} parámetro
/* reimportación * /}

signal_handle vacío (señal int)
{
/* señal cuando se recibe el programa sale * SIGUSR2 /
FILE * fp;
time_t t;
if ((fp = fopen (" test.log ", " a ")) > = 0)
{
t = tiempo (0);
fprintf (fp, " I la señal recibida (% d), salida en% s \\ n ", señal, asctime (localtime (&t)));
fclose (fp );
}
de salida (0);
}
int main (int argc, char ** argv)
{
FILE * fp;
time_t t;
init_daemon (); //inicializado a daemon
señal (SIGCHLD, SIG_IGN); /* ignorar el niño proceso sale de la señal, si después de este proceso ha producido un niño,
si no se controla esta señal, será zombies en el proceso hijo salidas * /
señal (SIGUSR1, signal_reload); /* proceso de señal SIGUSR1, esta señal puede ser definida como el parámetro reasigna señal * /
señal (SIGUSR2, signal_handle); /* proceso SIGUSR2 señal, esta señal puede definirse como la señal de salida * /
while (1) //test.log intervalos de un minuto para comunicar el estado de funcionamiento
{
/* esto es programar la parte del cuerpo, por lo que la En el siguiente de la finalización del trabajo, como por ejemplo servicio http, el servicio FTP, etc. * /
sueño (60); //dormir una minuto
if ((fp = fopen (" test.log ", " a ")) > = 0) /* Tenga en cuenta que puesto que la trayectoria init_daemon que ha sido cambiado a /tmp, por lo que este archivo es /tmp/test.log*/
{
t = tiempo (0);
fprintf (fp, " estoy aquí en% s \\ n ", asctime (hora local (&t)));
fclose (fp);
}}

}
extremo //////////////////////////////daemontest.c ///////////////////////////////////////////
compilado usando la compilación conjunta comando: gcc
init_daemon.c daemontest.c
tenía un programa llamado a.out Todo lo que pueda ejecutar este procedimiento. /a.out arriba.
Si desea que este programa se ejecute automáticamente al iniciar el sistema, puede utilizar el comando su /etc/rc.d/rc.local en el interior con una línea como:
do - Jacky -c " /bin /a.out"
este comando se ejecuta como un proceso de usuario Jacky /bin/a.out programa
programa se está ejecutando si modifica los parámetros del programa, tendrá que volver a importar los parámetros del programa, a continuación, puede utilizar comando ps para ver el programa de proceso de Identificación:
ps-ef | grep a.out
luego se envían al programa con los parámetros de comando kill, tales como:
matar -s SIGUSR1 11422
Del mismo modo, si usted quiere terminar el programa, a continuación, enviar una señal al programa SIGUSR2:
matar - s SIGUSR2 11422
Copyright © Conocimiento de Windows All Rights Reserved