C 为什么我的Linux信号处理程序对信号没有反应?
为什么我发出USR1和USR2信号时,它没有反应?您的信号处理工作正常。只是C 为什么我的Linux信号处理程序对信号没有反应?,c,linux,signals,C,Linux,Signals,为什么我发出USR1和USR2信号时,它没有反应?您的信号处理工作正常。只是/n不是新行字符。因为不打印新行,所以所有输出都保存在缓冲区中。当您使用kill signal终止进程时,此缓冲区将被丢弃。如有许多评论和回复,请在printf格式字符串中使用\n而不是/n。或调用,例如添加fflush(NULL)在您的printf之后 但是,在信号处理程序中调用printf是错误的。请参阅有关异步信号安全函数的说明(printf不是异步信号安全函数) 实际上,信号处理程序最好设置一些volatile
/n
不是新行字符。因为不打印新行,所以所有输出都保存在缓冲区中。当您使用kill signal终止进程时,此缓冲区将被丢弃。如有许多评论和回复,请在printf
格式字符串中使用\n
而不是/n
。或调用,例如添加fflush(NULL)代码>在您的printf
之后
但是,在信号处理程序中调用printf
是错误的。请参阅有关异步信号安全函数的说明(printf
不是异步信号安全函数)
实际上,信号处理程序最好设置一些volatile sigamatic\u t
标志,这些标志应该在代码中的一些重要位置进行测试
如果使用某个事件循环,建议的技巧是在程序的开头附近创建一些,在事件循环中轮询该管道(例如,通过使用),并在信号处理程序中写入该管道(write
is async signal safe!)
另见。printf(“/n”)代码>-->printf(“\n”)代码>顺便说一句:您不应该在信号处理程序中使用printf()。代码是从某处复制的,我没有注意到“/n”。实际上,这种信号处理是错误的,因为printf
不是异步信号安全的。看见
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
static void pr_mask(const char * string) {
sigset_t procmask;
sigprocmask(SIG_SETMASK, NULL, &procmask);
printf("%s: ", string);
if(sigismember(&procmask, SIGINT))
printf("SIGINT ");
if(sigismember(&procmask, SIGUSR1))
printf("SIGUSR1 ");
if(sigismember(&procmask, SIGUSR2))
printf("SIGUSR2 ");
if(sigismember(&procmask, SIGTERM))
printf("SIGTERM ");
if(sigismember(&procmask, SIGQUIT))
printf("SIGQUIT ");
printf("/n");
}
static void sigusr(int signum)
{
pr_mask("int sigusr");
if(signum == SIGUSR1)
printf("SIGUSR1 received/n");
else if(signum == SIGUSR2)
printf("SIGUSR2 received/n");
else
printf("signal %d received/n", signum);
}
int main(void)
{
if(signal(SIGUSR1, sigusr) == SIG_ERR) {
printf("error catching SIGUSR1/n");
exit(1);
}
if(signal(SIGUSR2, SIG_IGN) == SIG_ERR) {
printf("error ignoring SIGUSR2/n");
exit(1);
}
if(signal(SIGINT, SIG_DFL) == SIG_ERR) {
printf("error setting SIGINT to default/n");
exit(1);
}
while(1)
pause();
exit(0);
}
tomxue@ubuntu:~$ ./a.out &
[2] 5554
[1] Killed ./a.out
tomxue@ubuntu:~$ kill -USR1 5554
tomxue@ubuntu:~$ kill -USR2 5554
tomxue@ubuntu:~$ kill -9 5554
[2]+ Killed ./a.out