没有收到来自父进程的信号
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 发布的确切结果。
【讨论】:
以上是关于没有收到来自父进程的信号的主要内容,如果未能解决你的问题,请参考以下文章