【发布时间】:2015-11-06 11:53:17
【问题描述】:
方案一:
#include<stdio.h>
#include<signal.h>
void handler(int sig);
void main()
{
printf("PID: %d\n",getpid());
signal(SIGABRT,handler);
while(1){
printf("Hai\n");
sleep(1);
abort();
}
}
void handler(int sig)
{
printf("Signal handled\n");
}
输出 1:
$ ./a.out
PID: 32235
Hai
Signal handled
Aborted (core dumped)
$
根据参考资料,abort 函数的工作方式类似于 raise(SIGABRT)。因此,abort() 函数生成的信号是 SIGABRT。因此,我创建了上述程序。
在该程序中,处理 SIGABRT 信号。信号处理程序执行后,它不会返回到调用它的主函数。为什么handler完成后不返回main函数?
方案二:
#include<stdio.h>
#include<signal.h>
void handler(int sig);
void main()
{
printf("PID: %d\n",getpid());
signal(SIGABRT,handler);
while(1){
printf("Hai\n");
sleep(1);
}
}
void handler(int sig)
{
printf("Signal handled\n");
}
输出 2:
$ ./a.out
PID: 32247
Hai
Hai
Hai
Signal handled
Hai
Signal handled
Hai
Hai
^C
$
与程序 1 不同,程序 2 按预期执行。在上面的程序中,信号是通过命令行通过kill命令发送到进程的,如下所示。
$ kill -6 32247
$ kill -6 32247
所以一旦信号发生,处理函数就会执行,然后返回到主函数。但这在程序 1 中并没有发生。为什么会这样呢? abort 函数和 SIGABRT 有什么不同?
【问题讨论】:
-
我想你想知道这两个电话之间的区别。 Possible duplicate here
-
阅读signal(7)。不要在信号处理程序中调用
printf。 -
@BasileStarynkevitch:实际上,AIUI,如果您确定信号不是异步生成的,您可以从信号处理程序中调用
printf()。对abort()的调用不是异步的,而来自 shell 的kill -6是异步的。