我试图在我的应用程序中禁用为单个信号生成的核心转储。
在我的情况下,ulimit -c 0无法工作,因为它需要在应用程序启动之前执行,并且将完全禁用所有信号的核心转储。
是否有可能对单个信号做出这样的例外,或者至少在一定时间内禁用核心转储生成(例如。在发送SIGHUP信号时)?
发布于 2017-05-23 03:38:21
#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返回正常代码并在那里执行它。
发布于 2017-05-23 14:32:30
只需为SIGHUP添加一个空信号处理程序,或者像这样忽略它:
signal(SIGHUP, SIG_IGN);https://stackoverflow.com/questions/44124761
复制相似问题