使用fork()和信号处理时输出奇怪

ac-*_*lap 3 c fork signals signal-handling

#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>

void sighup()
{
    signal(SIGHUP,sighup);
    printf("Received SIGHUP! Happy Now ??\n");
}

void sigbus()
{
    signal(SIGBUS,sigbus);
    printf("received SIGBUS! Get a life dude !\n");
}

void sigquit()
{
    printf("I am done with you. Bye!!\n");
    fflush(stdout);
    exit(0);
}

int main()
{   
    int pid = fork();

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

    if (pid == 0)
    {   
        printf("child\n");

        signal(SIGHUP,sighup);
        signal(SIGBUS,sigbus);
        signal(SIGQUIT,sigquit);
        while(1)
        {
            ;
        }
    }
    else
    {
        printf("parent\n");
        kill(pid, SIGHUP);
        kill(pid, SIGBUS);
        kill(pid, SIGQUIT);

        wait();
    }
}
Run Code Online (Sandbox Code Playgroud)

我写这个程序作为信号处理任务的一部分,但程序的输出有点奇怪.

该程序的输出是::

parent
Run Code Online (Sandbox Code Playgroud)

ideone link :: http://ideone.com/a1DCik

我不知道这是怎么输出的.似乎没有创建子进程.

请解释输出.

Ker*_* SB 5

您的两个进程之间没有同步.完全可以想象子进程接收到未处理的信号并在它执行任何signal调用之前死掉.

事实上,这极有可能:父进程在执行fork()并执行杀戮后立即继续执行,而首先需要创建和调度子进程.这两项的花费很长的时间相比,在父杀调用,如果你是一个单核的机器上,你必须是非常幸运的,如果你想看到父母被暂停之前它进入这kill()条线.

  • @Kerrek我改变了代码,现在我在分叉之前调度信号,但输出仍然非常有线.http://ideone.com/AS1xor (2认同)