我是使用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);
}
我想知道的是为什么我们再次调用信号处理程序&#34;(SIGINT,intproc)&#34;在intproc()函数中?
我尝试在该函数中没有该信号处理程序的情况下运行此代码,并且它也正常工作。
答案 0 :(得分:3)
这是非常古老的代码。在过去(可能是SunOS3,1990-s),执行时会自动卸载信号处理程序。请参阅signal(2)(SysV和BSD行为之间的差异)并避免使用signal
。
仔细阅读signal(7),然后使用sigaction(2)。不要使用signal(2)
。关心异步信号安全功能(唯一可以从信号处理程序调用的;你不应该在信号处理程序中使用printf
!)。考虑在信号处理程序中设置一些volatile sig_atomic_t
全局(或static
)变量(并在外部测试)。
阅读Advanced Linux Programming,详细解释了这些内容。
答案 1 :(得分:1)
函数intproc
完成后,程序继续执行,但信号操作恢复为默认值。当它收到第二个SIGINT
信号时,程序采取默认操作,即终止程序。
如果您想保留信号处理程序,则需要再次调用signal
重新建立它。
这就是为什么你应该总是比sigaction
函数更强大signal
。