程序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)
$
根据引用,中止功能的工作方式类似于
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不同吗? 最佳答案
请参阅man 3 abort
的此文档:
还有这个:
因此,防止abort()
中止程序的唯一方法是通过信号处理程序中的longjmp()
-ing。
关于c - C中止功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33566228/