2011-04-21 5 views
3

재부팅 또는 시스템 종료를 가로 챌 필요가 있습니다. 그 prgram은 다음과 같습니다 :이 프로그램이 init/reboot/shutdown에서 SIGTERM을받지 못한 이유는 무엇입니까?

void sig_handler(int sig) { 
    if (sig == SIGTERM) { 
     /* do something */ 
    } 
} 

int main() { 
    .... 
    signal(SIGTERM, sig_handler); 

    /* daemon */ 
    pid = fork(); 
    if (pid > 0) exit(EXIT_SUCCESS); 
    // I didn't do setsid() to retain process group id. 
    .... 
} 

이것은 'kill -15'로 테스트했을 때 작동합니다. 그러나 '재부팅'또는 '종료'명령을 시도했을 때 신호를받지 못했습니다. init 매뉴얼 페이지는 다음과 같습니다 :

"init가 런레벨을 변경하도록 요구되면, 새로운 런레벨에서 정의되지 않은 모든 프로세스에 경고 신호 SIGTERM을 보내고 5 초 후에 SIGKILL을 통해 프로세스를 강제 종료합니다 init은 init이 원래 생성 한 것과 동일한 프로세스 그룹에 모든 프로세스와 그 하위 프로세스가 남아 있다고 가정합니다. 어떤 프로세스가 자신의 프로세스 그룹을 변경하면 이러한 시그널을받지 못합니다. 이러한 프로세스는 별도로 종료해야합니다. . "

이 프로그램에 SIGTERM을 보내려면 init 데몬에게 어떻게 말하는가? 내 생각 엔 init이 알고있는 것으로 프로세스 그룹 id를 설정해야하지만, 어떻게해야합니까?

답변

4

프로그램이 init 시스템에 의해 시작되지 않으면 init 시스템에서 관리하지 않습니다. 설명 된 이점을 얻으려면 init.d 스크립트에서 시작하십시오.

+0

init이 알고있는 것에 pgid를 설정하는 프로그래밍 방식이 있습니까? – duyt

+0

* * init이 부모 체인을 찾는다 고 의심하지만, 내가 당신이라면 그 소스를 읽을 것입니다. – bmargulies

+0

내가 아는 한 기존 프로세스 그룹에 참여할 수 없습니다. 당신은 새로운 것을 만들 수 있습니다. –

관련 문제