Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在自己的处理程序中捕获信号 #包括 #包括 无效处理程序(int signo) { printf(“进入处理程序\n”); 而(1),; } int main() { 结构动作法; act.sa_handler=handler; act.sa_标志=0; sigemptyset(和act.sa_面具); sigation(SIGINT,&act,NULL); 而(1),; 返回0; }_C_Unix_Posix_Signals_Sigint - Fatal编程技术网

在自己的处理程序中捕获信号 #包括 #包括 无效处理程序(int signo) { printf(“进入处理程序\n”); 而(1),; } int main() { 结构动作法; act.sa_handler=handler; act.sa_标志=0; sigemptyset(和act.sa_面具); sigation(SIGINT,&act,NULL); 而(1),; 返回0; }

在自己的处理程序中捕获信号 #包括 #包括 无效处理程序(int signo) { printf(“进入处理程序\n”); 而(1),; } int main() { 结构动作法; act.sa_handler=handler; act.sa_标志=0; sigemptyset(和act.sa_面具); sigation(SIGINT,&act,NULL); 而(1),; 返回0; },c,unix,posix,signals,sigint,C,Unix,Posix,Signals,Sigint,捕捉一次键盘中断后,当我再次按下“Ctrl+C”时,SIGINT不会被处理。。。 我希望每次按下“Ctrl+C”时都能打印“进入处理程序” 我想在“SIGINT handler()”本身内部捕获SIGINT..处理程序中的“while(1)”正在阻止第一个服务调用返回。删除该命令,随后的中断将导致再次调用处理程序 中断服务例程不应阻止调用线程返回。不过,您所做的似乎是一个非常糟糕的主意,最好只是从处理程序中设置一个标志并从它返回,然后从main进行打印 您需要在信号处理程序本身内设置SA_NOD

捕捉一次键盘中断后,当我再次按下“Ctrl+C”时,SIGINT不会被处理。。。 我希望每次按下“Ctrl+C”时都能打印“进入处理程序”

我想在“SIGINT handler()”本身内部捕获SIGINT..

处理程序中的“while(1)”正在阻止第一个服务调用返回。删除该命令,随后的中断将导致再次调用处理程序


中断服务例程不应阻止调用线程返回。

不过,您所做的似乎是一个非常糟糕的主意,最好只是从处理程序中设置一个标志并从它返回,然后从main进行打印

您需要在信号处理程序本身内设置
SA_NODEFER
或以其他方式重新启用信号,因为在调用处理程序之前,信号会被阻塞或切换回其默认行为


从信号处理程序调用
printf
是未定义的行为。它可能会使你的程序崩溃。实际上可以从信号处理程序安全调用的函数列表非常有限

您需要在SA_掩码上设置SA_NODEFER,以捕获与当前处理的信号相同的信号:

SA_NODEFER:不要阻止信号从其自己的信号处理程序中接收。SA_NOMASK是该标志的过时的非标准同义词


在信号处理程序中使用
printf
函数并不是一个好主意,因为它可能导致未定义的行为!代码示例缺少信号处理程序工作的一个重要部分……请查看我在Q6上的博客。如何捕获分段错误?”


此外,您还需要使用更健壮的方法来替换
while
循环,以便在测试信号处理程序时退出程序……例如……如何退出?

您可以使用类似的方法来代替printf:

#include<stdio.h>
#include<signal.h>

void handler(int signo)
{
    printf("Into handler\n");
    while(1);
}
int main()
{
    struct sigaction act;
    act.sa_handler = handler;
    act.sa_flags = 0;
    sigemptyset(& act.sa_mask);
    sigaction(SIGINT, &act, NULL);
    while(1);
    return 0;
}
从信号处理器调用函数
write(..)
是安全的。
不要忘记在使用它时包含
unistd.h
标题。

+1在“似乎是个非常糟糕的主意”。一般来说,保持信号处理程序尽可能简短是一个好办法。这就是为什么我写了“sigeptypest(&act.sa_mask);”这样就不会屏蔽任何信号。。我错在哪里?实际上,我想学习“如何在自己的信号处理器中捕获特定信号?”。这就是为什么我在调用信号处理程序之前问了一个问题:信号被阻塞了(或者处理程序被更改为SIG_DFL)。在此之前设置的内容(主要)没有任何效果。正如手册页中所述,这取决于实现。在Linux上,它只是在调用处理程序之前阻塞信号,在处理程序返回后取消阻塞。然后重写Unix内核。我刚刚开始阅读有关信号的内容。。。那么,正确的方法是什么呢?看看代码,您将使用'sigeptypyset',然后设置标志,然后使用'sigaction(SIGINT,&sigact,(struct sigaction*)NULL);'在它之后调用…这会捕获SIGINT..您在调用'sigePentySet'之前要设置标志…顺便说一句,这是在生产环境中使用的,在AIX下可以很好地工作…注意:这不能保证不会丢失信号!如果您的进程在不在时隙或不可中断的内核调用中获得多个相同类型的非实时信号,则第二个(以及更多)信号将丢失。您可能更安全地参考
stdout
,而不是
1
,因为各种方法可能会导致此数字发生变化。
const char *str = "Into handler\n";
write(1, str, strlen(str));