我试图禁用核心转储正在为我的应用程序中的个别信号生成。ulimit -c 0在我的情况下不起作用,因为它需要在应用程序启动之前执行,并且将完全禁用所有信号的核心转储。是否可以为单个信号设置这样的例外,或者至少在一定时间内禁用核心转储生成(例如,在发送SIGHUP信号期间)?
ulimit -c 0
xcitsw881#
#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不是safec-signal-safe,因此我们不应该从信号处理程序内部调用它,因此使用siglongjmp返回到正常代码并在那里执行。
RLIMIT_CORE
SA_RESETHAND
setrlimit
siglongjmp
mdfafbf12#
只需为SIGHUP添加一个空的信号处理程序,或者像这样忽略它:
signal(SIGHUP, SIG_IGN);
字符串
2条答案
按热度按时间xcitsw881#
字符串
您可以安装一个信号处理程序,它将
RLIMIT_CORE
设置为0,然后继续执行默认的信号操作。如果您使用SA_RESETHAND
,则在信号处理程序运行之前会自动重新安装默认的信号处理程序。但是,setrlimit
不是safec-signal-safe,因此我们不应该从信号处理程序内部调用它,因此使用siglongjmp
返回到正常代码并在那里执行。mdfafbf12#
只需为SIGHUP添加一个空的信号处理程序,或者像这样忽略它:
字符串