没有收到来自父进程的信号
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 -1
和 errno
设置为 ESRCH
.
来确认
另请记住,printf
不是信号安全的。
我正在 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 -1
和 errno
设置为 ESRCH
.
另请记住,printf
不是信号安全的。