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

Posted

技术标签:

【中文标题】没有收到来自父进程的信号【英文标题】:Not receiving signal from the parent process 【发布时间】:2020-10-04 11:45:34 【问题描述】:

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

我想知道是不是我的电脑问题?

【问题讨论】:

在这里工作,我无法确认任何问题(Ubuntu 20.04)。 我建议尝试在您的系统上运行它并确保在运行期间两个进程都存在,我认为您不应该在在线编译器中运行多个进程 虽然您的代码没有错,但在 POSIX 系统中,sigaction() 通常比signal() 更受欢迎,因为sigaction() 的语义实际上是可移植的。 signal() 的确切行为因实施而异。 【参考方案1】:

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

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

【讨论】:

谢谢。那么我该如何修改代码或者我应该在哪里查找来解决这个问题? 让父进程在fork之前安装处理程序。它们由孩子继承。 实际的处理程序是什么 传递给signal的函数,如void sighup。它处理输入信号。【参考方案2】:

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

【讨论】:

以上是关于没有收到来自父进程的信号的主要内容,如果未能解决你的问题,请参考以下文章

在父进程收到终止信号并退出后,让 system() 生成的子进程继续运行

僵死进程的清除

准确处理来自父进程的SIGUSR1类型的所有信号。 C

如何从信号处理程序内部向其他进程发送通知?

进程控制---子进程终止状态相关的宏

PHP 中的僵尸进程孤儿进程详解