Дочерний процесс не работает должным образом - PullRequest
0 голосов
/ 24 ноября 2010

Я попробовал пример с этого сайта: 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);
}

Ответы [ 2 ]

1 голос
/ 24 ноября 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;
  }
1 голос
/ 24 ноября 2010

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

...