2017-05-23 19 views
0

응용 프로그램에서 개별 신호에 대해 생성되는 코어 덤프를 사용하지 않도록 설정하려고합니다.SIGHUP 신호의 코어 덤프 사용 안함

ulimit -c 0 내 응용 프로그램을 시작하기 전에 실행해야하므로 모든 신호에 대해 코어 덤프가 완전히 비활성화됩니다.

단일 신호에 대해 예외를 만들거나 적어도 일정 기간 (예 : SIGHUP 신호 전송 중) 코어 덤프 생성을 비활성화 할 수 있습니까?

+0

당신은 여전히 ​​SIGHUP 수신에 중단하거나 무시하도록 프로그램을 원하십니까? – ephemient

+0

@ephemient SIGHUP에서 내 응용 프로그램을 중단합니다. –

+0

아. 그런 다음 애플리케이션을 수정해야합니다. – ephemient

답변

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은 async-signal-safe가 아니므로 신호 처리기 내부에서 호출해서는 안되며 따라서 siglongjmp을 사용하여 정상 코드로 돌아가서 수행해야합니다.

+0

정말 고마워요. –

0

그냥 SIGHUP을 위해 빈 신호 처리기를 추가하거나, 이런 식으로 무시 :

signal(SIGHUP, SIG_IGN); 
+0

신호를 받았을 때 원래의 질문자가 관심을 갖고있는 것일 때 중단되지 않습니다. – ephemient