0
맨 페이지와 Google이 도움이되지 않는 이상한 동작이 있습니다.sigprocmask를 사용하여 마스크를 설정하면 어디에서 호출합니까?
내 코드에서 SIGUSR2가 전송 될 때 SIGINT를 차단/차단 해제하려고합니다. 테스트에 대한
void handleBlock(int signal){
if(sigintBlocked){
printf("Unblocking SIGINT ...\n");
sigprocmask(SIG_UNBLOCK, &signals_protected, NULL);
sigintBlocked = false;
}
else{
printf("Blocking SIGINT ...\n");
sigprocmask(SIG_BLOCK, &signals_protected, NULL);
sigintBlocked = true;
}
}
는 I이처럼 호출 :
SIGUSR2이 함수가 호출 전송되는 경우void installSignallHandler(){
sBlock.sa_handler = handleBlock;
sigemptyset(&sBlock.sa_mask);
sigaddset(&sBlock.sa_mask, SIGUSR2);
sBlock.sa_flags = 0;
sigaction(SIGUSR2, &sBlock, NULL);
sigemptyset(&signals_protected);
sigaddset(&signals_protected, SIGINT);
// For some reason sigprocmask only works if it is called here the first time
// sigprocmask(SIG_BLOCK, &signals_protected, NULL);
// sigintBlocked = true;
}
이 들어 I는 신호 처리기를 설치하고 함수 마스크 세트를 준비
int main(int argc, char **argv) {
installSignallHandler();
while(1){
printf("processing...\n");
sleep(1);
}
return EXIT_SUCCESS;
}
이제 문제는 : 코드를 게시 한 방식으로 sigprocmask는 아무런 효과가 없습니다. 하지만 위의 두 줄을 주석 처리하지 않으면 작동합니다. 그래서 내 두 가지 질문 :
- 이 동작을 설명 할 수 있습니까?
- 해결하려면 어떻게해야합니까? - 차단 된 신호로 시작하고 싶지 않습니다.
더 많은 정보를 가지고? 내 문제에 대한 링크에서 문제가 발생하지 않았습니다. – timmornYE
@Wotim 시그널 핸들러 내에서 sigprocmask()가 불려 갔을 경우, 핸들러로부터 돌아와, 보류 중의 시그널 마스크를 복원 해, sigprocmask()의 처리를 취소 할 수가 있습니다. – Sasi