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