신고자와 통지자라는 두 가지 독립적 인 프로세스의 컨텍스트에서 신호 처리기로 작업하고 싶습니다. 기록기는 판독기에 제 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 루프에서 종료된다. 그리고 작가는 "당신과 관련된 프로세스가 없습니다"라고 인쇄합니다.
중첩 신호 처리기가 허용 되는가? 예인 경우 권장 되는가? 또한 작성자가 준비되었음을 독자에게 알리는 다른 대체 메커니즘이 있습니까?
참조 ['시그널 핸들러에서의 printf()'사용하지 않도록하는 방법은?] (http://stackoverflow.com/questions/16891019/how-으로, 리눅스에서 테스트 기본 정보를 위해 신호 처리기로 /를 사용하지 않아야한다). 신호 처리기에서는 가능한 한 작게 수행해야합니다. 시그널 핸들러에서 어떤 함수를 호출 할 수 있는지에 대한 엄격한 제한이 있습니다 - 그리고'printf()'함수 군은 OK 함수 목록에 없습니다 (어떤 도움이된다면'strlen()'도 아닙니다 - 그러나 거기에는 'printf()'외에도 좋은 이유가 있으며'strlen()'에 대한 좋은 이유를 알지 못합니다.) –
신호 처리기를 "중첩"하지 않고 다른 신호용으로 처리기를 두 개 설치했습니다. 또한'sigsuspend (2)'와 관련된 호출을 살펴 봐야하는데, 이는 신호를 기다리는 것을 허락한다. – bnaecker