matar señal de ejemplo

Estoy tratando de este ejemplo que tomé de: http://www.cs.cf.ac.uk/Dave/C/node24.html:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void sighup(); /* routines child will call upon sigtrap */
void sigint();
void sigquit();

main() { 
 int pid;

 /* get child process */

 if ((pid = fork()) < 0) {
    perror("fork");
    exit(1);
 }

if (pid == 0) { /* child */
   printf("\nI am the new child!\n\n");
       signal(SIGHUP,sighup); /* set function calls */
       signal(SIGINT,sigint);
       signal(SIGQUIT, sigquit);
       printf("\nChild going to loop...\n\n");
      for(;;); /* loop for ever */
 }
else /* parent */
 {  /* pid hold id of child */
   printf("\nPARENT: sending SIGHUP\n\n");
   kill(pid,SIGHUP);
   sleep(3); /* pause for 3 secs */
   printf("\nPARENT: sending SIGINT\n\n");
   kill(pid,SIGINT);
   sleep(3); /* pause for 3 secs */
   printf("\nPARENT: sending SIGQUIT\n\n");
   kill(pid,SIGQUIT);
   sleep(3);
 }
}

void sighup() {
   signal(SIGHUP,sighup); /* reset signal */
   printf("CHILD: I have received a SIGHUP\n");
}

void sigint() {
    signal(SIGINT,sigint); /* reset signal */
    printf("CHILD: I have received a SIGINT\n");
}

void sigquit() {
  printf("My DADDY has Killed me!!!\n");
  exit(0);
}

Pero yo no veo ninguna salida del proceso hijo.

Es el comportamiento esperado? Si es así; ¿por qué?

Muchas gracias!

OriginalEl autor Christian Wagner | 2011-06-09

2 Kommentare

  1. 2

    El código tiene una importante condición de carrera. No asegurarse de que el niño ha terminado de llamar signal antes de que el padre envía las señales. Usted necesidad de utilizar algún tipo de sincronización primitiva para hacer que los padres se espere a que el niño a instalar los controladores, o necesita instalar los controladores de señal antes de que se bifurcan para que el niño hereda de ellos.

    Aquí la forma más fácil manera que conozco para sincronizar procesos como este:

    1. Antes de que se bifurcan, llamada pipe(p) para crear una tubería.
    2. fork().
    3. En el padre, close(p[1]); (la redacción final) y read(p[0], &dummy, 1);
    4. En el niño, close(p[0]); y close(p[1]); después de instalar los controladores de señal.
    5. Cuando el padre regresa de read, usted puede estar seguro de que el niño ha de instalación de sus manejadores de señal. También puede close(p[0]); en el padre en este momento.

    Edit 2: tal vez una mejor y más fácil:

    1. Antes de que se bifurcan, llamada sigprocmask para bloquear todas las señales y guardar la vieja señal de máscara.
    2. En el padre, llame sigprocmask de nuevo a la derecha después de la bifurcación para restaurar la señal original de la máscara.
    3. En el niño, llame a la sigprocmask justo después de instalar los controladores de señal para restaurar la señal original de la máscara.

    OriginalEl autor R..

  2. 0

    Debe utilizar getpid() en lugar de (pid).

    OP, mencionó sin salida del proceso hijo (a). getpid() sólo le dará el id del proceso. que va a resolver el problema?

    OriginalEl autor gkslsahin

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea