1

我有一个在 Linux 下工作的守护进程。程序接收到 SIGSEGV 信号但它没有立即停止,根据它收到 SIGSEGV 的日志时间是 -01:11:45.085并且它停止工作的时间是 - 01:11:48.219 它是多线程的,并且在生成 SIGSEGV 时它有 25 个线程。

所以,问题是程序如何设法额外工作 3 秒,即使没有从生成 SIGSEGV 的线程执行任何操作?

谢谢。

4

1 回答 1

3

SIGSEGV 默认会终止进程,但您可以处理信号,signal.h 是 C 中的标头,例如,如果您需要在退出之前清理文件或通信。我做了一个简短的代码示例,它确实会导致 SIGSEGV 并对其进行处理并在之后执行某些操作,这只是一个示例,可能不是一个很好的示例。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void sighandler( int signal);
int main(){
    signal(SIGSEGV,sighandler);
    int* a = NULL;
    a[0] = 5;
    return 0;
}

void cleanup(){
    // do neccesary cleanup
    sleep(3);
    exit(0);
}

void sighandler( int signal){
    if ( signal == SIGSEGV){
        printf("oups, sigsegv\n");
    } else {
        printf("some sig\n");
    }
    cleanup();
}
于 2013-05-23T14:14:27.563 回答