Дочерний процесс не работает должным образом

Я попробовал пример с этого веб-сайта: http://www.cs.cf.ac.uk/Dave/C/node24.html Иногда вывод не показывает сообщение от дочерних процессов. Я пытаюсь понять, почему? Кто-нибудь может помочь?

#include <stdio.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 */
       signal(SIGHUP,sighup); /* set function calls */
       signal(SIGINT,sigint);
       signal(SIGQUIT, sigquit);
       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);
}

person Community    schedule 24.11.2010    source источник


Ответы (2)


Потому что иногда родитель запланирован до запуска дочернего элемента, а иногда и наоборот. Если ребенок не установил обработчики при доставке сигналов, вы не видите свои сообщения.

person Ben Jackson    schedule 24.11.2010
comment
решение - установить обработчики сигналов перед fork(), а затем отключить их в родительском - person tobyodavies; 24.11.2010
comment
@tobyodavies: я не понимаю, что ты имеешь в виду. Вы можете опубликовать некоторые изменения? - person ; 24.11.2010

Вы можете отправить родителю сигнал после того, как ребенок установил все свои дескрипторы

 if (pid == 0)
 { /* child */
   signal(SIGHUP,sighup); /* set function calls */
   signal(SIGINT,sigint);
   signal(SIGQUIT, sigquit);
   kill(getppid() , SOMESIGNAL);
   for(;;); /* loop for ever */
 }

и убедитесь, что родитель будет ждать сигнала, используя pause()

   pause();
   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);

Ваш обработчик, который обрабатывает SOMESIGNAL, может быть реализован следующим образом:

 void sig_somesignal()
 {
    return;
  }
person Yongzhi    schedule 24.11.2010