sigaction仅捕获一次信号

sigaction仅捕获一次信号,c,linux,signals,signal-handling,sigaction,C,Linux,Signals,Signal Handling,Sigaction,考虑以下代码: #包括 #包括 无效捕获() { printf(“hi\n”); } int main() { 结构动作法; act.sa_handler=catch; sigation(SIGINT,&act,NULL); 对于(;); 返回0; } 当这个程序运行时。我第一次按CTRL-C时,它会打印“hi” 但是第二次程序退出时。这可能是什么原因 我想要的是程序在每次发出信号时捕捉信号。如果不使用任何SA_标志来明确定义“第一次捕捉信号后要做什么”的行为,那么它应该是工作 清除sigac

考虑以下代码:

#包括
#包括
无效捕获()
{
printf(“hi\n”);
}
int main()
{
结构动作法;
act.sa_handler=catch;
sigation(SIGINT,&act,NULL);
对于(;);
返回0;
}
当这个程序运行时。我第一次按CTRL-C时,它会打印“hi”
但是第二次程序退出时。这可能是什么原因

我想要的是程序在每次发出信号时捕捉信号。

如果不使用任何SA_标志来明确定义“第一次捕捉信号后要做什么”的行为,那么它应该是工作

清除sigaction的内容,然后初始化它

memset(&act,0,sizeof(act)); // clear contents first
act.sa_handler = catch;
sigaction(SIGINT, &act, NULL);

此外,不要像Daniel指出的那样在信号处理程序中使用printf。看

如果您想打印某些内容,或只是在信号处理程序中执行某些操作,则必须使用信号安全功能。在您的例子中,可以使用write()系统调用,而不是使用printf。看


如果您不使用任何SA_标志来明确定义“第一次捕获信号后要做什么”的行为,那么它应该是工作

清除sigaction的内容,然后初始化它

memset(&act,0,sizeof(act)); // clear contents first
act.sa_handler = catch;
sigaction(SIGINT, &act, NULL);

此外,不要像Daniel指出的那样在信号处理程序中使用printf。看

如果您想打印某些内容,或只是在信号处理程序中执行某些操作,则必须使用信号安全功能。在您的例子中,可以使用write()系统调用,而不是使用printf。看


另一方面,您不应该从信号处理程序调用
printf
,因为它不能保证是信号安全函数。请参阅。您没有正确初始化结构。您还需要设置标志和掩码。另一方面,您不应该从信号处理程序调用
printf
,因为它不能保证是信号安全函数。请参阅。您没有正确初始化结构。您还需要设置标志和掩码。因此,如果printf不安全,是否有其他方法可以从信号处理程序内部打印一些文本?把这个代码放在memset中起作用了。因此,一旦信号产生,我们就需要清除信号,以便它再次工作。这个清理工作记录在哪里?手册页中是否有此信息?从信号处理程序中缩放
写入
可以覆盖
错误号
,中断错误处理code@StaceyGirl说得好。信号处理程序必须做基本的事情,而不是做复杂的I/O操作此初始化是否完成?正如jonathan提到的,这不是正确的方法initialize@asharani如果您不需要任何特殊的东西,例如新的信号掩码,可以使用此初始化步骤。通过这种方式,您的处理程序将具有默认行为。因此,如果printf不安全,是否有其他方法可以从信号处理程序内部打印一些文本?把这个代码放在memset中起作用了。因此,一旦信号产生,我们就需要清除信号,以便它再次工作。这个清理工作记录在哪里?手册页中是否有此信息?从信号处理程序中缩放
写入
可以覆盖
错误号
,中断错误处理code@StaceyGirl说得好。信号处理程序必须做基本的事情,而不是做复杂的I/O操作此初始化是否完成?正如jonathan提到的,这不是正确的方法initialize@asharani如果您不需要任何特殊的东西,例如新的信号掩码,可以使用此初始化步骤。这样,处理程序将具有默认行为。