응용 프로그램에서 개별 신호에 대해 생성되는 코어 덤프를 사용하지 않도록 설정하려고합니다.SIGHUP 신호의 코어 덤프 사용 안함
ulimit -c 0
내 응용 프로그램을 시작하기 전에 실행해야하므로 모든 신호에 대해 코어 덤프가 완전히 비활성화됩니다.
단일 신호에 대해 예외를 만들거나 적어도 일정 기간 (예 : SIGHUP 신호 전송 중) 코어 덤프 생성을 비활성화 할 수 있습니까?
응용 프로그램에서 개별 신호에 대해 생성되는 코어 덤프를 사용하지 않도록 설정하려고합니다.SIGHUP 신호의 코어 덤프 사용 안함
ulimit -c 0
내 응용 프로그램을 시작하기 전에 실행해야하므로 모든 신호에 대해 코어 덤프가 완전히 비활성화됩니다.
단일 신호에 대해 예외를 만들거나 적어도 일정 기간 (예 : SIGHUP 신호 전송 중) 코어 덤프 생성을 비활성화 할 수 있습니까?
#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
은 async-signal-safe가 아니므로 신호 처리기 내부에서 호출해서는 안되며 따라서 siglongjmp
을 사용하여 정상 코드로 돌아가서 수행해야합니다.
정말 고마워요. –
그냥 SIGHUP을 위해 빈 신호 처리기를 추가하거나, 이런 식으로 무시 :
signal(SIGHUP, SIG_IGN);
신호를 받았을 때 원래의 질문자가 관심을 갖고있는 것일 때 중단되지 않습니다. – ephemient
당신은 여전히 SIGHUP 수신에 중단하거나 무시하도록 프로그램을 원하십니까? – ephemient
@ephemient SIGHUP에서 내 응용 프로그램을 중단합니다. –
아. 그런 다음 애플리케이션을 수정해야합니다. – ephemient