2008-08-24 15 views
21

sigprocmask()을 사용하는 방법을 완전히 이해하지 못했습니다. 특히, setoldset 및 그 구문이 어떻게 작동하고 어떻게 사용하는지.sigprocmask()에서 설정하고 이전 세트

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 

예를 들어 차단하고 SIGUSR1을 몇 초 동안 말한 다음 차단을 해제하고 처리하십시오.

답변

61

set에 마스크를 제공하는 것이 효과적이며 신호 목록입니다. how 인수는 마스크로해야 할 일이 set이라고 말합니다.

set 목록의 신호를 차단하려면 SIG_BLOCK을 사용하고 차단을 해제하려면 SIG_UNBLOCK을 사용할 수 있습니다. 이들 중 어느 것도 목록에 설정되지 않은 신호를 변경하지 않습니다. SIG_SETMASK은 목록의 신호를 차단하고 목록에 설정되지 않은 신호를 차단 해제합니다. 예를 들어

, 기존의 차단 목록 {SIGSEGV, SIGSUSP} 것을 가정하고 이러한 인수 sigprocmask 전화 :

sigset_t x; 
sigemptyset (&x); 
sigaddset(&x, SIGUSR1); 
sigprocmask(SIG_BLOCK, &x, NULL) 

새로운 차단 목록 지금 {SIGSEGV, SIGSUSP, SIGUSR1} 될 것입니다.

당신은 지금이 인수 sigprocmask 호출하는 경우 : 새로운 차단 목록이 다시 {SIGSEGV, SIGSUSP} 인에 갈 것

sigprocmask(SIG_UNBLOCK, &x, NULL) 

합니다. 지금이 인수 sigprocmask를 호출 할 경우

은 :

sigprocmask(SIG_SETMASK, &x, NULL) 

새로운 차단 목록은 이제 {SIGUSR1}로 설정됩니다.

oldset 인수는 이전 차단 목록이 무엇인지 알려줍니다. 우리는이 선언이있는 경우 :

sigset_t y; 

을 우리는이 같은 이전 예제의 코드를 호출 : 지금

sigprocmask(SIG_BLOCK, &x, &y) 

을 우리는 가지고 :

y == {SIGSEGV, SIGSUSP} 

우리가 지금 할 경우

sigprocmask(SIG_UNBLOCK, &x, &y) 

y == {SIGSEGV, SIGSUSP, SIGUSR1} 

우리가 할 경우 :

sigprocmask(SIG_SET, &x, &y) 

우리는이를 얻을 수 있습니다 :

y == {SIGSEGV, SIGSUSP} 

를이 차단 세트의 이전 값이기 때문입니다.

+0

{SIGSEGV, SIGSUSP} 목록은 sigprocmask (SIG_BLOCK, & x, NULL)로 보내지지 않습니다. 그런 다음 차단되는 이유는 무엇입니까? x는 sigusr1 만 포함합니다. – user2975699

+3

@ Nathan - 당신의 설명은 훌륭합니다 - 사람들이 sigprocmack을 이해하는데 도움이되는 바위처럼 여전히 견고한 7 년 – oneday