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

Not receiving signal from the parent process

我正在 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

请问是不是我的电脑问题?

并不是所有的在线Ccompilers/environments都是一样的。试试 repl.it,我刚刚试过了,得到了 geeks4geeks 发布的准确结果。

代码错误地假设 child 在 发送信号之前 安装了处理程序。可能是这样,但不能保证。当然,如果没有安装处理程序,child 会立即被杀死。您可以通过测试 kill returns -1errno 设置为 ESRCH.

来确认

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