프로세스를 종료하고 정상적으로 종료하도록 지시하는 POSIX 표준 방법은 SIGTERM
신호를 보냅니다. 응용 프로그램에 따라 SIGINT
에서 종료하는 것이 적절할 수도 있고 그렇지 않을 수도 있습니다. 이는 프로세스를 중단하고 종료하지 않기위한 것입니다. (Control-c는 SIGINT
을 전송합니다.)
좁은 루프에 플래그를 넣으십시오. 종료하기 쉽지만 즉시 종료 할 수있을 때 플래그를 확인하십시오. 귀하의 경우 SIGTERM
을 수령하면 즉시 시스템 로그에 메시지가 표시 될 수 있으며 다음 5 분 이내에 종료하겠다고 약속 할 수 있습니다.
귀하의 신호 핸들러는 다음과 같이 표시됩니다
static int signalled; // if nonzero, what signal have we been sent?
static void SignalHandler(int signum) {
signalled = signum;
}
나는 초당 몇 번을 의미 모든 I/O 작업, 후 글로벌
static
변수
signalled
를 확인합니다.
static __sighandler_t sh, si, st;
static void catch_signals(void) {
if ((sh = signal(SIGHUP, SignalHandler)) == SIG_IGN) signal(SIGHUP, SIG_IGN);
if ((si = signal(SIGINT, SignalHandler)) == SIG_IGN) signal(SIGINT, SIG_IGN);
if ((st = signal(SIGTERM, SignalHandler)) == SIG_IGN) signal(SIGTERM, SIG_IGN);
signalled = 0;
}
static void restore_signals(void) {
signal(SIGHUP, sh);
signal(SIGINT, si);
signal(SIGTERM, st);
}
(.이 코드는 라이브러리에서, 그래서 나는 것들을 내가 그들을 발견하는 방법을두고 추가 조심 해요)
보너스 :
여기 신호를 잡아 복원 내 코드입니다 트릭 : 시간이 만료되면 (이것은 TV 녹화 라이브러리 임), 타이머는 단지 signalled = SIGTERM
으로 설정하고, 동일한 로직을 사용하여 레코더를 정상적으로 종료합니다.여기
@dear downvoter 이것은 좋은 대답입니다. 팝 오버 텍스트 "이 답변은 유용하지 않습니다"를 정당화하기 위해 의견을 제공 할 수 있습니까? – cnicutar