신호 세트는 sigset_t
유형을 통해 조작됩니다. 몇몇 동작은 신호 세트를 사용할 수있다 :
- 가
sigemptyset
통해 빈 집합 S를 생성 S는 = ∅
- 는 신호들
sigaddset
, S = S∪ {S}
- 제거를 통해 세트 S에 추가
sigdelset
을 통해 세트의 신호 s, S = S \ {s}
sigfillset
을 통해 모든 가능한 신호 세트를 생성하십시오.
- 테스트는 신호 s가
sigismember
, s∈S를 통해 주어진 집합 S에 있는지?
이러한 설정은 다른 장소에서 사용되는 : 새로운 프로세스의 신호 마스크를 설정, 신호 처리 중에 설정 블로킹 등 계류중인 신호의 집합을 요청
서로 다른 신호를 잡을하려면
, 그것을 일부 포착 기능이 다른 기능으로 중단되어서는 안되기 때문에 특정 신호를 전달하는 동안 차단 될 신호 세트를 추가 할 수 있습니다. 실제로 SIGALRM 전달 중에 SIGINT를 차단하기로 결정했을 때 (주석을 제거했을 때). 그래서 당신은 핸들러의 실행 중에 SIGINT를 보내서 만 이것을 관찰 할 수있다. 실현하기 어렵다.
중요한 예가 어디일까요?
SIGUSR1의 핸들러가 주어진 데이터 구조를 수정하고 SIGUSR2의 핸들러가 동일한 데이터 구조를 사용한다고 가정하십시오. 두 핸들러를 동시에 수행하지 않는 것이 매우 중요합니다. 하나는 다른 핸들러를 따라 실행될 수 있지만 다른 핸들러가 전달되는 동안 핸들러가 인터럽트하지 않으려는 것일 수 있습니다. 귀하의 코드는 자기 - 동시입니다, 단 한 스레드의 경우에도 신호가 동시성으로 이어질 수 있다고합니다.
'sigaddset()'을 주석 처리하거나 주석 처리하지 않고 프로그램을 실행할 때'CTRL + C'를 눌러 보셨습니까? –
@SouravGhosh 예 그러나 다른 답변에서 지적한 바와 같이 알람 처리기는 그 영향을 신속하게 파악하기 위해 실행됩니다. 핸들러에서'sleep (10)'을 추가하면 그 차이를 볼 수 있습니다 :) – NeDark