2016-09-05 4 views
1

Mac OS에서 C 프로그램을 실행했습니다. 내 프로그램의 일부는 다음과 같습니다. 이 코드는 sigint 신호에서 잘 실행되지만 sigkill 신호에서는 작동하지 않습니다. 나는의 printf에서 볼 수있는, 그것은 함수 SIGINT()를 입력하고 플래그 값을 변경할 수 있습니다, 내가 sleep(1)를 작성하지 않은 처음에는C에서 linux, signal 및 sleep()을 루프에 넣음

  1. :

    void sigkill(int sig){ 
        /*some code neglected*/ 
        exit(0); 
    } 
    void sigint(int sig){ 
        flag=1; 
    } 
    
    void alive(void) { 
        signal(SIGINT, sigint); 
        signal(SIGKILL, sigkill); 
        alarm(10); 
        while(1){ 
         //printf("%d\n",flag); 
         sleep(1); 
         if(flag==1){ 
          printf("no\n"); 
          flag=0; 
         } 
        } 
    } 
    

    나는 네 가지 질문이 있습니다. 그러나 내가 예상 한대로 "아니오"출력이 없습니다.

  2. 수면 기능을 추가 한 후 잘 작동합니다. 나는 while 루프가 1 초마다 플래그를 검사하고, flag = 1이면 "no"를 출력한다고 가정합니다. 그러나 Ctrl + c를 누를 때마다 매번 "아니오"출력으로 보입니다. 왜 1 초를 기다리지 않습니까?

  3. "잠깐 기다리려면 'sleep()'을 사용하지 말고 loop()와 함께 alarm()을 사용하십시오." sleep()없이 구현하는 방법을 알고 싶습니다.

  4. kill 명령은 sigkill 함수를 호출 할 수 없습니다. 어떻게 수정합니까? 이 커널에 시스템 호출을 할 때 일반적으로

+3

'SIGKILL'기간을 트래핑 할 수 없습니다. 'SIGKILL'에 대한 트랩을 설정할 수 없습니다. 덧붙여 말하면'SIGSTOP '. –

+0

sleep()을 사용하지 않고 구현하는 방법을 알고 계십니까? –

+0

'alarm()'과'sleep()'을 섞는 것이 100 % 신뢰할 만하지 않습니다. 'alarm()'과'pause()'를 사용할 수 있습니다 -'pause()'는 인터럽트되고 시그널 핸들러가 리턴 될 때만 리턴합니다. 잠깐 잠을 자려면'select()'와'poll()'과 플랫폼 특정 변형을 사용할 수 있습니다. 'nanosleep()'과'usleep()'을 사용하면 나노초와 마이크로 초 해상도의 수면을 할 수 있습니다 (정확도는 일반적으로 해상도만큼 좋지 않습니다). 당신이 열심히 보면 어딘가에 수백 초의 수면이있을 것입니다. –

답변

3
  1. 는 신호는 응용 프로그램에서 "붙 잡았다"할 수 있습니다. 보통 while(1) { if (flag==1){...} }을 실행하면 절대로 커널을 호출하지 않습니다. 이론적으로, 여러분이 바깥 쪽 printfwhile(1) 루프에서 수행하면 커널에 호출되어야 신호가 잡힐 수 있습니다.
  2. sleep()은 신호에 의해 중단됩니다. man 페이지에서 sleep(3)을 확인하십시오.
  3. alarm(2)에 대한 매뉴얼 페이지를 확인하십시오.
  4. SIGKILL 또는 SIGSTOP의 신호 처리기를 변경할 수 없습니다. 이러한 신호 효과는 커널에 하드 코드됩니다. sigaction(2)에서 :

    시그넘 신호를 지정하고 SIGKILLSIGSTOP 제외한 유효 신호가 될 수있다.

    인수가없는 kill 명령은 SIGKILL 신호를 생성하지 않습니다. SIGTERM을 생성합니다.

+0

제 3의 대답을 정말로 이해하지 못합니다. 잠을 자지 않고 구현하는 방법은 무엇입니까? –

+1

'alarm (2)'에 대한 맨 페이지에서 : alarm()은 초 단위로 SIGALRM 시그널이 전달되도록 조정합니다 .' –