【发布时间】:2024-01-10 09:42:01
【问题描述】:
如果进程接收到信号,我如何获得?以下示例的目的是 fork 一个进程,用子进程读取一个字符并将 SIGUSR1 发送给父进程,但如果 10 秒后用户仍然需要插入该字符,则子进程终止。问题是如何知道是否收到了 SIGUSR1:
#define _POSIX_SOURCE
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
void handle_USR1()
{
return;
}
int main(void)
{
int p[2];
pid_t pid;
if(pipe(p) == -1)
{
perror("pipe");
return -1;
}
if((pid = fork()) == -1)
{
perror("fork");
return -1;
}
if(pid == 0)
{
close(p[0]);
char ch, b;
ch = getchar();
if(ch != '\n')
while((b = getchar()) != '\n' && b != EOF);
write(p[1], &ch, 1);
kill(getppid(),SIGUSR1);
exit(-1);
}
else
{
signal(SIGUSR1,handle_USR1);
close(p[1]);
char ch;
sleep(10);
kill(pid, SIGTERM);
read(p[0],&ch,1);
//if(/*SIGUSR1 is not recived*/)
//{
// exit(-1);
//}
printf("\n\n%c",ch);
}
return 0;
}
我可以用什么替换/*SIGUSR1 is not recived*/?
【问题讨论】:
-
您的
handle_USR1()函数应该将static volatile sig_atomic_t变量设置为已知值(例如1)。然后,您可以检查该变量以了解是否已收到信号。在标准 C 中,您可以在信号处理程序中以严格一致的方式执行其他操作。在 POSIX 中,您可能会做得更多(但要小心:Avoid usingprintf()in a signal handler 可能会帮助您。 -
好的,所以没有标准 C 函数可以做到这一点,对吧?
-
@SimoneBonato 不,但为什么要有一个? Jonathan Leffler 的方法非常好,而且事情通常都是这样完成的。