没有收到来自父进程的信号

问题描述

我正在使用GeeksForGeeks https://www.geeksforgeeks.org/signals-c-set-2/?ref=lbp上的C语言学习两个过程之间的通信。我正在尝试运行网站上提供的代码。我只是将代码复制到在线C编译器中。

// C program to implement sighup(),sigint() 
// and sigquit() signal functions 
#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 

// function declaration 
void sighup(); 
void sigint(); 
void sigquit(); 

// driver code 
void main() 
{ 
    int pid; 

    /* get child process */
    if ((pid = fork()) < 0) { 
        perror("fork"); 
        exit(1); 
    } 

    if (pid == 0) { /* child */
        signal(SIGHUP,sighup); 
        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); 
    } 
} 

// sighup() function deFinition 
void sighup() 

{ 
    signal(SIGHUP,sighup); /* reset signal */
    printf("CHILD: I have received a SIGHUP\n"); 
} 

// sigint() function deFinition 
void sigint() 

{ 
    signal(SIGINT,sigint); /* reset signal */
    printf("CHILD: I have received a SIGINT\n"); 
} 

// sigquit() function deFinition 
void sigquit() 
{ 
    printf("My DADDY has Killed me!!!\n"); 
    exit(0); 
} 

但是,我所得到的就是这样

PARENT: sending SIGHUP                                                                                                                                                             
                                                                                                                                                                                   
                                                                                                                                                                                   
PARENT: sending SIGINT                                                                                                                                                             
                                                                                                                                                                                   
                                                                                                                                                                                   
PARENT: sending SIGQUIT

我想知道这是我的计算机问题吗?

解决方法

该代码错误地假定孩子在父母发送信号之前 安装了处理程序。可能是这样,但不能保证。当然,如果未安装处理程序,则立即杀死该孩子。您可以通过测试kill返回-1并将errno设置为ESRCH来确认。

还请记住,printf不是 信号安全。

,

并非所有在线C编译器/环境都是一样的。试试repl.it,我刚刚尝试了一下,得到了geeks4geeks发布的确切结果。