2011-10-02 1 views
0

나는 (sa_mask를 사용하여) 핸들러가 실행 중일 때 시그널이 마스킹되는 것을 숨길 수 있다는 것을 알고있다. 그러나 일부 전역 변수를 업데이트 할 때 신호를 마스크하는 방법을 알고 싶습니다.전역 변수가 갱신 될 때 마스킹 신호

또한 특정 사용자 정의 함수가 실행될 때 신호를 마스크하는 방법을 알고 싶습니다.

이 두 가지 작업을 수행 할 수 있습니까?

어떤 도움을

감사

답변

0

당신은 "신호()"당신이 원하는 언제든지 호출 할 수 있습니다를 이해할 수있을 것이다; a) 신호 처리기를 사용자 정의 코드로 설정하거나 b) 처리기 인수를 NULL로 설정하여 지우십시오.

sigaction()은 물론 더 세분화 된 제어를 제공합니다. 원할 때마다 (예를 들어, 전역 변수를 업데이트하기 전에) sigaction을 호출 할 수 있습니다.

이 링크는 도움이 될 수 있습니다 :

http://www.linuxjournal.com/article/6483

+0

사용자 정의 함수의 실행 기간 동안 신호를 차단하는 방법은 어떻습니까? – CuriousCoder

0

sigblock()로 신호를 차단할 수 있습니다. 차단 된 신호는 신호가 차단 해제 될 때 대기 및 해제됩니다.

이것은 매우 비쌉니다. 차단하려면 syscall을, 차단을 해제하려면 syscall을 수행해야합니다. 자주하면 쉽게 느려질 수 있습니다. 따라서 대체 접근법이 있습니다.

  1. Linux를 사용하는 경우 signalfd을 사용하십시오. 번을 모두 번 블록하여 파일 설명자로 리디렉션 한 다음 안전하다고 판단 될 때마다 처리 할 수 ​​있습니다.
  2. 그렇지 않으면 (비동기 신호 처리가 중요한 경우) 사용자 공간에서 신호를 지연시킬 수 있습니다. 중요 섹션을 입력하기 전에 volatile 플래그를 설정하십시오. 신호 처리기에서이 플래그를 확인하십시오. 신호가 보이면 write()pipe에 신호하고 즉시 반환합니다. 신호 처리기에서이 파이프의 신호를 다시 확인한 다음 해당 지점의 신호를 다시 raise으로 다시 입력하십시오.