杀死信号的例子

Chr*_*ner 5 c unix signals kill

我正在尝试这个例子: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);
}
Run Code Online (Sandbox Code Playgroud)

但我没有看到子进程的任何输出.

这是预期的行为吗?如果是这样; 为什么?

非常感谢你!

R..*_*R.. 2

您的代码存在主要竞争条件。您无法确保在signal父级发送信号之前子级已完成调用。您要么需要使用某种同步原语来使父级等待子级安装处理程序,要么需要在分叉之前安装信号处理程序,以便子级继承它们。

这是我所知道的同步进程的最简单方法:

  1. 在分叉之前,调用pipe(p)创建管道。
  2. fork()
  3. 在父级中,close(p[1]);(书写端)和read(p[0], &dummy, 1);
  4. 在子进程中,close(p[0]);以及close(p[1]);安装信号处理程序之后。
  5. 当父进程从 中返回时read,您可以确定子进程已设置其信号处理程序。close(p[0]);此时您也可以在父级中。

编辑2:也许是更好、更简单的方法:

  1. 在分叉之前,调用sigprocmask阻塞所有信号并保存旧的信号掩码。
  2. 在父级中,sigprocmask分叉后立即再次调用以恢复原始信号掩码。
  3. 在子进程中,sigprocmask安装信号处理程序后立即调用以恢复原始信号掩码。