为什么我们两次调用Signal Handler?
作者:互联网
我是一个使用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-s),执行时会自动卸载信号处理程序.请参阅signal(2)(SysV和BSD行为之间的差异),并避免使用信号.
仔细阅读signal(7),然后使用sigaction(2).请勿使用signal(2).注意异步信号安全功能(您可以从信号处理程序中调用的唯一函数;您不应在信号处理程序内使用printf!).考虑简单地在信号处理程序中设置一些易失性sig_atomic_t全局(或静态)变量(并在外部进行测试).
阅读Advanced Linux Programming,其中详细说明了这些内容.
标签:c-3,linux,signals,signal-processing 来源: https://codeday.me/bug/20191030/1964807.html