程序 1:
#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信号。信号处理程序执行后,它不会返回到调用它的主函数。为什么处理程序完成后不返回到主函数?
程序2:
#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有什么不同吗?
printf
。 - Basile Starynkevitchprintf()
。从shell中的kill -6
是异步的,而对abort()
的调用不是异步的。 - rodrigo