¿Cómo puedo manejar SIGCHLD?

2 minutos de lectura

avatar de usuario
canoz

necesito manejar SIGCHLD adecuadamente. ¿Cómo puedo usarlo con mi código existente? por el momento no puedo esperar al proceso hijo a menos que use 0 en lugar de WNOHANG|WUNTRACED.

status = 0; 
pid_t child, endID;

if(amp == 1)
        signal( SIGCHLD, SIG_IGN ); 

child = fork(); 

if (child  <  0) {    
        perror("fork() error\n");
        exit(EXIT_FAILURE);

} else if (child == 0) { 
        // do sth here
        perror("error\n");

} else { 
        //sleep(1)

si elimino sleep entonces el padre se ejecuta primero … ¿por qué?

  • Qué estás intentando lograr ?

    – cnicutar

    24 de agosto de 2011 a las 7:13

  • Permita la combinación de procesos de fondo y primer plano escribiendo e instalando una función de controlador de señal adecuada

    – Kanoz

    24 de agosto de 2011 a las 7:18

  • ¿Qué debe hacer el controlador de señales?

    – cnicutar

    24 de agosto de 2011 a las 7:19

  • mata o ignora zombies

    – Kanoz

    24 de agosto de 2011 a las 7:20

  • Esto parece estar relacionado con Ejemplo de waitpid(), WNOHANGy SIGCHLD.

    –Jonathan Leffler

    24 de agosto de 2011 a las 7:25

avatar de usuario
cnicutar

Aquí hay un comienzo (pero lea a continuación):

static void
child_handler(int sig)
{
    pid_t pid;
    int status;

    /* EEEEXTEERMINAAATE! */
    while((pid = waitpid(-1, &status, WNOHANG)) > 0)
        ;
}

/* Establish handler. */
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = child_handler;

sigaction(SIGCHLD, &sa, NULL);

Por supuesto, esto es todo inútil. Si el padre simplemente ignora SIGCHLDlos niños son cosechados en silencio y no se convertirán en zombis.

citando TLPI:

Establecer explícitamente la disposición de SIGCHLD en SIG_IGN hace que cualquier proceso secundario que finalice posteriormente se elimine inmediatamente del sistema en lugar de convertirse en un zombi.

Así que algo como esto debería hacer el truco para ti:

signal(SIGCHLD, SIG_IGN); /* Silently (and portably) reap children. */

  • ¿Dónde debo llamar a este método?

    – Kanoz

    24 de agosto de 2011 a las 7:25

  • @kanoz Lea el último párrafo 🙂

    – cnicutar

    24 de agosto de 2011 a las 7:26

  • Acabo de encontrarme con esta pregunta porque necesitaba manejar SIGCHLD, y no encontré muy claro dónde debería llamarse la línea que nos proporcionó. Como no necesita ningún pid ni nada, simplemente lo puse en cualquier lugar, ¿verdad? Gracias @cnicutar.

    – hfingler

    1 de septiembre de 2011 a las 3:38

  • @polar En algún lugar antes de comenzar a bifurcar.

    – cnicutar

    1 de septiembre de 2011 a las 7:55

  • Como dijiste: establecer explícitamente la disposición de SIGCHLD en SIG_IGN hace que cualquier proceso secundario que finalice posteriormente se elimine inmediatamente del sistema en lugar de convertirse en un zombi. ¿Cómo se puede comprobar y prevenir esta situación? Creo que esto está pasando en mi caso?

    – kapilddit

    14/04/2014 a las 13:56

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad