C/Visual C - Matar procesos e hijos

 
Vista:

Matar procesos e hijos

Publicado por Alfonso Morales (1 intervención) el 22/10/2001 09:55:24
Hola, tengo un problema. Resulta que en C en UNIX creo procesos hijo mediante Fork, .. un padre crea un hijo y éste a la vez un nieto. Entonces, me encuentro con el ÚNICO problema de que cuando desde la shell hago un KILL -9 del proceso HIJO, ... el NIETO no consigo que se entere y no muere, con lo que se me queda el proceso colgado. Cómo puedo hacer que se entere??

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Manejo de señales en procesos hijos y nietos en C

Publicado por Alejandro (913 intervenciones) el 17/10/2024 17:21:15
Alfonso, cuando un proceso hijo es terminado con `kill -9`, el proceso nieto no recibe automáticamente una señal de terminación. Esto se debe a que el proceso nieto no es un hijo directo del proceso padre, y por lo tanto, no hereda la señal de terminación del proceso hijo.

Para manejar este problema, puedes implementar un mecanismo de señalización que permita al proceso nieto recibir la señal de terminación cuando el proceso hijo es terminado. Aquí hay algunas estrategias que puedes considerar:

1. Uso de señales:


Puedes usar señales para notificar al proceso nieto que su proceso padre ha sido terminado. Aquí hay un ejemplo básico de cómo hacerlo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
 
void manejadorSenal(int sig) {
    printf("Proceso nieto %d recibió la señal %d. Terminando...\n", getpid(), sig);
    exit(0); // Termina el proceso nieto
}
 
int main() {
    pid_t hijo, nieto;
 
    hijo = fork();
    if (hijo < 0) {
        perror("Error al crear el proceso hijo");
        exit(1);
    }
 
    if (hijo == 0) { // Proceso hijo
        nieto = fork();
        if (nieto < 0) {
            perror("Error al crear el proceso nieto");
            exit(1);
        }
 
        if (nieto == 0) { // Proceso nieto
            signal(SIGTERM, manejadorSenal); // Manejar la señal SIGTERM
            while (1) {
                printf("Proceso nieto %d en ejecución...\n", getpid());
                sleep(1);
            }
        } else { // Proceso hijo
            sleep(5); // Dejar que el nieto se ejecute un poco
            printf("Proceso hijo %d terminando...\n", getpid());
            kill(nieto, SIGTERM); // Terminar el nieto
            exit(0);
        }
    } else { // Proceso padre
        wait(NULL); // Esperar a que el hijo termine
    }
 
    return 0;
}

Explicación del código:



1. Manejador de señales: La función `manejadorSenal` se define para manejar la señal `SIGTERM`. Cuando el proceso nieto recibe esta señal, imprime un mensaje y termina.

2. Creación de procesos: El proceso padre crea un hijo, y el hijo a su vez crea un nieto.

3. Manejo de señales en el nieto: El proceso nieto establece un manejador para la señal `SIGTERM`. En un bucle infinito, imprime un mensaje cada segundo.

4. Terminación del nieto: El proceso hijo espera 5 segundos y luego envía una señal `SIGTERM` al nieto antes de terminar.

2. Uso de `waitpid`:


Otra opción es que el proceso padre use `waitpid` para esperar a que el proceso hijo termine y, al mismo tiempo, manejar la señal de terminación del hijo. Esto puede ser más complicado, pero es una opción válida.

3. Revisar el estado del proceso:


Si el proceso nieto no se termina, puedes revisar su estado desde el proceso padre y tomar acciones adicionales si es necesario.

Conclusión:


El uso de señales es una forma efectiva de manejar la terminación de procesos en C. Asegúrate de que el proceso nieto esté preparado para manejar la señal y terminar adecuadamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar