程序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/

10-12 02:47