【问题标题】:Disable core dump for SIGHUP signal禁用 SIGHUP 信号的核心转储
【发布时间】:2017-10-22 19:31:29
【问题描述】:

我正在尝试禁用为我的应用程序中的单个信号生成的核心转储。

ulimit -c 0 在我的情况下不起作用,因为它需要在应用程序启动之前执行,并且会完全禁用所有信号的核心转储。

是否可以对单个信号进行此类例外处理,或者至少在一定时间内禁用核心转储生成(例如,在发送 SIGHUP 信号期间)?

【问题讨论】:

  • 您仍然希望程序在收到 SIGHUP 时中止,还是忽略它?
  • @ephemient 我将在 SIGHUP 上中止我的应用程序。
  • 啊。然后你需要修改应用程序。

标签: bash unix freebsd core coredump


【解决方案1】:
#include <setjmp.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/resource.h>
#include <unistd.h>

static sigjmp_buf sigjmp;
static void sighup_handler(int signo) {
    siglongjmp(&sigjmp, signo);
}

int main(int argc, char **argv) {
    struct sigaction sighup_action = {
        .sa_handler = &sighup_handler,
        .sa_flags = SA_RESETHAND,
    };
    sigset_t sigset;
    int signo;

    sigemptyset(&sighup_action.sa_mask);
    sigaddset(&sighup_action.sa_mask, SIGHUP);
    sigprocmask(SIG_BLOCK, &sighup_action.sa_mask, &sigset);
    sigaction(SIGHUP, &sighup_action, NULL);
    signo = sigsetjmp(&sigjmp, 1);
    if (signo) {
        struct rlimit rl = { .rlim_cur = 0, .rlim_max = 0 };
        setrlimit(RLIMIT_CORE, &rl);
        sigprocmask(SIG_SETMASK, &sigset, NULL);
        kill(getpid(), signo);
        abort();  /* just in case */
        _exit(128 | signo);
    }
    sigprocmask(SIG_SETMASK, &sigset, NULL);

    pause(); /* or whatever the rest of your program does */
}

您可以安装一个信号处理程序,将RLIMIT_CORE 设置为 0,然后继续执行默认信号操作。如果您使用SA_RESETHAND,则在运行信号处理程序之前会自动重新安装默认信号处理程序。但是,setrlimit 不是异步信号安全的,因此我们不应该从信号处理程序内部调用它,因此使用siglongjmp 返回正常代码并在那里执行。

【讨论】:

  • 非常感谢。
【解决方案2】:

只需为 SIGHUP 添加一个空的信号处理程序,或者像这样忽略它:

signal(SIGHUP, SIG_IGN);

【讨论】:

  • 收到信号时不会中止,这显然是原始提问者感兴趣的东西。
猜你喜欢
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多