Red de conocimiento informático - Conocimiento informático - Cómo escribir un programa en segundo plano de Linux Daemon

Cómo escribir un programa en segundo plano de Linux Daemon

Puntos clave de la programación del demonio:

1. Ejecutar en segundo plano. ?

Para evitar colgar el terminal de control, coloque Daemon en segundo plano para su ejecución. El método consiste en llamar a fork en el proceso para finalizar el proceso principal y permitir que Daemon se ejecute en segundo plano en el proceso secundario. ?

if(pid=fork())?

exit(0); //¿Es el proceso padre? ¿Finalizar el proceso padre y el proceso hijo continuará?

2. ¿Sin terminal de control, sesión de inicio de sesión y grupo de procesos?

Es necesario introducir primero la relación entre el proceso y el terminal de control, sesión de inicio de sesión y grupo de procesos en Linux: a El proceso pertenece a un grupo de procesos y un grupo de procesos. El número (GID) es el número de proceso (PID) del líder del proceso. Una sesión de inicio de sesión puede contener varios grupos de procesos. Estos grupos de procesos comparten una terminal de control. Esta terminal de control suele ser la terminal de inicio de sesión donde se creó el proceso. ?

El control de terminales, sesiones de inicio de sesión y grupos de procesos generalmente se heredan del proceso principal. Nuestro propósito es deshacernos de ellos y no vernos afectados por ellos. El método es llamar a setsid() en base al punto 1 para hacer que el proceso sea el líder de la sesión:?

setsid();

Explicación: Cuando el proceso es el líder de la sesión La llamada a setsid () falló. Pero el primer punto ya asegura que el proceso no es el líder de la sesión. Después de que la llamada a setsid() sea exitosa, el proceso se convierte en el nuevo líder del grupo de sesión y el nuevo líder del grupo de procesos, y se separa de la sesión de inicio de sesión y del grupo de procesos originales. Debido a la exclusividad del proceso de sesión con el terminal de control, el proceso se desconecta del terminal de control al mismo tiempo. ?

3. ¿Impedir que el proceso vuelva a abrir la terminal de control?

Ahora, el proceso se ha convertido en el líder de la sesión sin una terminal. Pero se puede volver a aplicar para abrir una terminal de control. Puede evitar que un proceso vuelva a abrir la terminal de control haciendo que el proceso ya no sea el líder de la sesión:

if(pid=fork())?

exit(0); Fin del Capítulo 1 Un proceso hijo, el segundo proceso hijo continúa (el segundo proceso hijo ya no es el líder de la sesión)

4. ¿Cerrar el descriptor de archivo abierto?

El proceso comienza desde el padre que lo creó. El proceso hereda los descriptores de archivos abiertos allí. Si no se cierra, se desperdiciarán recursos del sistema, el sistema de archivos donde se encuentra el proceso no se podrá desmontar y se producirán errores impredecibles. Ciérrelos de la siguiente manera:?

for(i=0; cierro el descriptor de archivo abierto close(i); gt;?

5. ¿Cambiar el directorio de trabajo actual?< / p>

Cuando el proceso está activo, el sistema de archivos donde se encuentra su directorio de trabajo no se puede desmontar. Generalmente, el directorio de trabajo debe cambiarse al directorio raíz. Para los procesos que necesitan volcar el núcleo, cambie el directorio de trabajo. directorio a un directorio específico, como /tmpchdir("/")?

6. ¿Restablecer la máscara de creación de archivos?

Un proceso hereda la máscara de creación de archivos del proceso principal que creó. Puede modificar el demonio. Acceder a bits de archivos creados por el proceso. Para evitar esto, borre la máscara de creación de archivos: umask(0);

Manejar la señal SIGCHLD No es necesario, pero para algunos procesos, especialmente los procesos del servidor, a menudo generan procesos secundarios para manejar las solicitudes cuando llegan. Se convertirá en un proceso zombie y ocupará recursos del sistema. El proceso principal que espera a que finalice el proceso secundario aumentará la carga sobre el proceso principal y afectará el rendimiento de concurrencia del proceso del servidor. En Linux, simplemente puede configurar el funcionamiento de SIGCHLD. señal a SIG_IGN. ?

signal(SIGCHLD, SIG_IGN ;?

De esta manera, el kernel no generará un proceso zombie cuando finalice el proceso hijo. BSD4 En BSD4, debes esperar explícitamente a que finalice el proceso hijo antes de liberar el proceso zombie.

?

1. lista init.c?#include?lt;?unistd.h?gt;?

#include?lt;?signal.h?gt;?

#include?lt; ?sys/param.h?gt;?

#include?lt;?sys/types.h?gt;?

#include?lt;?sys/stat.h ?gt;?

void?init_daemon(void)?

{?

int?pid;?

int?i; ?

if(pid=fork())?

exit(0); //Es el proceso padre, ¿finalizar el proceso padre?

else ?if( pidlt;?0)?

exit(1); //fork falló, ¿salir?

//Es el primer proceso hijo, ¿continuar la ejecución en segundo plano?

setsid(); //¿El primer proceso hijo se convierte en el nuevo líder de sesión y líder del proceso?

//¿Y se separa del terminal de control?

if (pid=fork())?

exit(0); //¿Es el primer proceso hijo, finalizar el primer proceso hijo?

else?if(pidlt;?0) ?

exit(1); //fork falló, ¿salir?

//Es el segundo proceso hijo, ¿continuar?

//El segundo hijo el proceso ya no es un grupo de sesión ¿Long?

for(i=0;ilt;?NOFILE; i)//¿Cerrar el descriptor de archivo abierto?

close(i);?

chdir("/tmp"); //¿Cambiar el directorio de trabajo a /tmp?

umask(0); //¿Restablecer la máscara de creación de archivos?

regresar;?

}

2. lista test.c?#include?lt;?stdio.h?gt;?

#include?lt;?time.h?gt;?

void?init_daemon(void ); // ¿Función de inicialización del demonio?

main()?

{?

FILE?*fp;?

time_t ? t;?

init_daemon(); //¿Inicializar como demonio?

while(1)//¿Informar el estado de ejecución a test.log cada minuto?

{?

sleep(60); //¿Dormir un minuto?

if((fp=fopen("test.log", "a"))?gt ;=0)?

{?

t=time(0);?

fprintf(fp,"¿Estoy?aquí?en?sn ", asctime(hora local(amp;t))?);?

fclose(fp);?

}?

}?

}

El programa anterior se compila y se pasa bajo RedHat Linux. Los pasos son los siguientes:?

Compilar: gcc –g –o test init.c test.c?

Ejecutar: ./test?

Ver el proceso: ps –ef?

A partir del resultado, se puede encontrar que varias características del demonio de prueba cumplen con los requisitos anteriores.