2017-09-26 6 views
0

신고자와 통지자라는 두 가지 독립적 인 프로세스의 컨텍스트에서 신호 처리기로 작업하고 싶습니다. 기록기는 판독기에 제 1 신호 SIGUSR1을 전송하고, 판독기는 제 2 신호 SIGUSR2를 기록기에서들을 때까지 반복한다. I 리더 먼저 작업자 뒤에 실행하면C의 중첩 신호 처리기

reader.c

static volatile sig_atomic_t done_waiting; 

int handler1(int signal){ 
    done_waiting = 0; 
    while(!done_waiting){ 
      (void)fprintf(stdout, " reader waiting for sigusr2: done_waiting = %d\n", done_waiting); 
    } 
(void)fprintf(stdout, " reader received sigusr2 \n); 
} 

int handler2 (int signal){ 
     done_waiting = 1; 
} 

main(){ 
    signal(SIGUSR1, handler1); 
    signal(SIGUSR2, handler2); 
    sleep(5); // sleep till we start worker 
} 

writer.c에서이 신호

main(){ 
    kill(pid_reader, SIGUSR1); 
    sleep(5); 
    kill (pid_reader, SIGUSR2); 
} 

로 독자에게 전송되는 프로그램은 while 루프에서 종료된다. 그리고 작가는 "당신과 관련된 프로세스가 없습니다"라고 인쇄합니다.

중첩 신호 처리기가 허용 되는가? 예인 경우 권장 되는가? 또한 작성자가 준비되었음을 독자에게 알리는 다른 대체 메커니즘이 있습니까?

+1

참조 ['시그널 핸들러에서의 printf()'사용하지 않도록하는 방법은?] (http://stackoverflow.com/questions/16891019/how-으로, 리눅스에서 테스트 기본 정보를 위해 신호 처리기로 /를 사용하지 않아야한다). 신호 처리기에서는 가능한 한 작게 수행해야합니다. 시그널 핸들러에서 어떤 함수를 호출 할 수 있는지에 대한 엄격한 제한이 있습니다 - 그리고'printf()'함수 군은 OK 함수 목록에 없습니다 (어떤 도움이된다면'strlen()'도 아닙니다 - 그러나 거기에는 'printf()'외에도 좋은 이유가 있으며'strlen()'에 대한 좋은 이유를 알지 못합니다.) –

+1

신호 처리기를 "중첩"하지 않고 다른 신호용으로 처리기를 두 개 설치했습니다. 또한'sigsuspend (2)'와 관련된 호출을 살펴 봐야하는데, 이는 신호를 기다리는 것을 허락한다. – bnaecker

답변

0

어쩌면 신호 실제로 당신이 무엇을 의미하는지, 중첩되지 신호핸들러 중첩되어 있습니까? 명확히하기 위해, SIGUSR1의 핸들러가 실행되는 동안 SIGUSR2가 수신되면 어떻게 될 것인가? 나는 그렇게 생각한다.

필자가 작성한 writer 프로세스에 독자 프로세스의 pid를 얻기 위해 코드를 테스트했다. main에 args를 사용했다.

내가 얻은 결과가 있습니다.

  1. 우선 리더는,이 인쇄 연속적 SIGUSR2를 수신하면 그것이
  2. SIGUSR2
  3. 기다리는 쓰기 시작 SIGUSR1를 수신 한 후
  4. 조용

"리더 SIGUSR2 접수"이는임을 나타낸다 중첩 된 신호를 가질 수 있습니다. 그러나 의도적 인 디자인으로 추천한다고 말하지는 않습니다. 주석에서 언급했듯이 신호 처리기에서는 가능한 한 적게 수행해야하며 while 루프에서는 반복하지 말아야합니다. 또한 주석에서 언급했듯이 시그널 컨텍스트에서 어떤 함수를 호출하는지 조심해야합니다. printf()는 정상적으로 작동하는 것처럼 보일지라도 괜찮습니다.

고대 커널 3.16와 GCC 4.9