gpt4 book ai didi

c - 为什么我们调用 Signal Handler 两次?

转载 作者:太空狗 更新时间:2023-10-29 11:04:41 24 4
gpt4 key购买 nike

我是一个新手,用c语言来处理信号。我正在分析下面从特定资源中提取的信号处理代码。

这是代码。

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

void intproc();
void quitproc();

main()
{
int i;

signal(SIGINT,intproc);
signal(SIGQUIT,quitproc);

printf("Ctrl+c is disabled. Use ctrl+\\ to quit\n");

for (i=0;;i++) {
printf("In an infinite loop...\n");
sleep(200);
}
}


void intproc()
{
signal(SIGINT,intproc);
printf("You have pressed ctrl+c.\n");
}

void quitproc()
{ signal(SIGQUIT,intproc);
printf("You have pressed ctrl+\\. Now the program quits.\n");
exit(0);
}

我想知道的是为什么我们在 intproc() 函数中再次调用信号处理程序“(SIGINT,intproc)”?

我尝试在该函数中没有信号处理程序的情况下运行这段代码,它也能正常工作。

最佳答案

这是非常古老的代码。在过去(可能是 SunOS3,1990 年代),信号处理程序在执行时会自动卸载。参见 signal(2) (SysV 和 BSD 行为之间的差异)并避免使用 signal

仔细阅读signal(7)然后使用 sigaction(2) .不要使用 signal(2)。关心异步信号安全函数(唯一可以从信号处理程序调用的函数;您不应该在信号处理程序中使用 printf!)。考虑简单地在信号处理程序中设置一些 volatile sig_atomic_t 全局(或 static)变量(并在外部进行测试)。

阅读Advanced Linux Programming其中详细解释了这些事情。

关于c - 为什么我们调用 Signal Handler 两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20812394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com