子进程无法正常工作

时间:2010-11-24 02:36:53

标签: c process fork

我在这个网站上试了一个例子: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 个答案:

答案 0 :(得分:1)

因为有时在孩子跑步之前安排父母,有时反之亦然。如果孩子在传递信号时没有设置处理程序,则看不到您的消息。

答案 1 :(得分:1)

您可以在孩子设置了所有句柄后向父母发送信号

 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;
  }