问题描述
我正在使用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发布的确切结果。