2017-11-27 2 views
-1

QNX 클래스 노트에이 예가 있는데, 필자의 교수가 그 출력을 어떻게 내놓았는지 파악할 수 없습니다. 아무도 이것을 철저히 설명 할 수 있습니까? 이 프로그램은 부모 프로세스를 실행C 신호 처리기 교수의 예 설명

1234 PID 및 자식 프로세스가 있음 5678

출력 5678 : 카운터 = 1,234 0 : 카운터 = 10

#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <signal.h> 
#include <sys/types.h> 

/* 
* getpid() - returns the current processes pid. 
* getppid() - returns the parent processes pid. 
*/ 

int counter = 0; 

void signal_handler(int signo) 
{ 
    counter++; 
} 

int main(int argc, char *argv[]) { 
    int i = 0; 
    int rv; 

    struct sigaction sa; 

    sa.sa_handler = signal_handler; 
    //queue signals. 
    sa.sa_flags = SA_SIGINFO; 
    sigemptyset(&sa.sa_mask); 

    sigaction(SIGUSR1, &sa, NULL); 

    switch(fork()) 
    { 
     case 0: 
      for(i = 0; i < 10; i++) 
      { 
       kill(getppid(), SIGUSR1); 
      } 
      break; 
     default: 
      wait(&rv); 
      break; 
    } 

    printf("%d: counter = %d\n", getpid(), counter); 
    return 0; 
} 
+0

그럼 .. 직접 해 보셨습니까? –

+0

@ EugeneSh.i 않았다 –

+0

그것은 어떻게 할 것이라고 생각하니? 왜? – rici

답변

1

fork 만들고 counter의 자체 사본을 가진 하위 프로세스

자식 프로세스에서 호출 한 killgetppid()을 사용하여 pid를 가져 오기 때문에 SIGUSR1을 부모 프로세스로 보냅니다.

부모 프로세스가 wait에 차단되어 있거나 forkwait 사이에 차단되어 있습니다. 자식이 보낸 SIGUSR1 각각에 대해 부모는 신호 처리기로 점프하고 counter의 사본을 증가시키고 무엇을 하던지로 돌아갑니다.

일반적으로 wait은 신호가 대기 중일 때 처리되면 EINTR 오류로 복귀 할 수 있습니다. SA_RESTARTsa.sa_flags으로 설정하면 시스템 호출이 다시 시작되지만 여기서는 wait이 신호에 의해 중단되지 않는다고 가정합니다 (QNX는이를 보장합니까?).

counter의 아동용 사본은 영향을받지 않습니다. wait은 자식이 종료 될 때까지 부모를 차단합니다. 따라서 자식은 counter 인 값인 0을 인쇄하고 wait에서 부모가 깨어나 counter 인 값인 10을 인쇄합니다.