2017-11-21 7 views
2

쉘에 C 코드를 작성하는 임무가 있습니다. 쉘 명령 중 하나는 "quit kill"입니다. 여기서 주 프로세스를 종료하기 전에 모든 하위 프로세스에 TERM 신호를 보내야합니다. 자식 프로세스가 5 초 동안 종료되지 않으면 죽이기 위해 KILL 신호를 보내야합니다. 이제 코드를 작성했습니다. 테스트하고 싶습니다. 어떻게 TERM 신호를 무시하는 프로세스가 있는지 잘 모릅니다. 필요한이SIGTERM의 영향을받지 않는 프로세스가 있습니까?

void nothing(int x) { 
    // nothing 
} 

상기 추가 예를 들어, 아무것도하지 않는 함수를 선언

#include <signal.h> 

을 포함 추가

  kill(pid,SIGTERM); 
      t = time(NULL); 
      while(1){ 
       int state = waitpid(pid,&status,WNOHANG); 
       if(state<0){ 
        perror("Error "); 
        exit(0); 
       } 
       if(state == 0){ 
        if((time(NULL)-t)>5){ 
         printf("(5 sec passed) Sending SIGKILL… Done.\n"); 
         kill(pid,SIGKILL); 
         break; 
        } 
       } 
       else{ 
        printf("Done.\n"); 
        break; 
       } 
      } 

답변

3

: 여기 내가 하나의 자식 프로세스를 종료하기 위해 쓴 코드입니다 "보호 된"프로세스 코드의 시작

signal(SIGTERM, nothing); 
프로세스는 다음의 주요 코드가 보내는 TERM 신호를 잡아, 그리고 아무것도하지 않는 기능 nothing()을 실행할 것이다

-

(@rici 코멘트에서 당신은 또한 nothing() 기능을 사용하지 않고 signal(SIGTERM, SIG_IGN);을 수행 할 수 있습니다).

signal man page.

#!/bin/bash 
trap '' TERM 
cat 

파일 및 출시에 넣어 :

+2

'SIG_IGN'을 사용할 수 있습니다 (동일한 매뉴얼 페이지 참조). 그리고 당신은 시그널 핸들러에서'printf'를 사용할 수 없습니다. http://man7.org/linux/man-pages/man7/signal-safety.7.html – rici

+0

나는 고치다. 감사. –

+0

@ Raeedmndow 가장 도움이된다고 생각되면 Accepted로 표시 할 수 있습니다. –

4

이 bash는 스크립트는 TERM 무시합니다. 그런 다음 TERM으로 그것을 죽이려고합니다.