【问题标题】:Daemon continue working after SIGSEGVSIGSEGV 后守护进程继续工作
【发布时间】:2013-05-18 22:15:45
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 也许SIGSEGV 被捕获或“忽略”,而其他线程可以再运行几秒钟......无论如何SIGSEGV 被发送到有问题的线程(但默认情况下会杀死整个进程)。

标签: c++ linux daemon


【解决方案1】:

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();
}

【讨论】:

  • 警告:信号处理程序可以直接或间接调用一组非常有限的函数。仔细阅读signal(7)
  • 确实,您不能从信号处理程序中进行任意“清理”工作。相反,告诉线程有关信号(例如,通过设置sig_atomic_t 变量或写入管道)并让线程干净地关闭程序。
  • 感谢您的列表!我不经常使用信号,主要是为了我自己的消遣,但我从未研究过我被允许做什么。
猜你喜欢
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 2016-10-07
  • 2013-06-10
  • 2013-06-25
  • 2013-02-04
  • 1970-01-01
相关资源
最近更新 更多