sigprocmask()의 Set 및 Oldset
-
09-06-2019 - |
문제
사용법을 완전히 이해하지 못했습니다. sigprocmask()
.특히, 어떻게 set
그리고 oldset
구문 작업 및 사용 방법.
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
예를 들어 설명해주세요. 차단하려면 SIGUSR1이라고 몇 초 동안 말한 다음 차단을 해제하고 처리하세요.
해결책
아이디어는 당신이 마스크를 제공한다는 것입니다 set
, 사실상 신호 목록입니다.그만큼 how
주장은 마스크로 무엇을 해야 하는지를 말합니다. set
.
다음 중 하나를 사용할 수 있습니다. SIG_BLOCK
내부의 신호를 차단하려면 set
목록 또는 SIG_UNBLOCK
차단을 해제하려면이들 중 어느 것도 목록에 설정되지 않은 신호를 변경하지 않습니다. SIG_SETMASK
목록의 신호를 차단하고 목록에 설정되지 않은 신호의 차단을 해제합니다.
예를 들어 이전 차단 목록이 다음과 같다고 가정합니다. {SIGSEGV, SIGSUSP}
그리고 당신은 전화 sigprocmask
다음 인수를 사용합니다.
sigset_t x;
sigemptyset (&x);
sigaddset(&x, SIGUSR1);
sigprocmask(SIG_BLOCK, &x, NULL)
이제 새로운 차단 목록은 다음과 같습니다. {SIGSEGV, SIGSUSP, SIGUSR1}
.
전화하면 sigprocmask
이제 다음 인수를 사용합니다.
sigprocmask(SIG_UNBLOCK, &x, NULL)
새로운 차단 목록은 다시 원래 상태로 돌아갑니다. {SIGSEGV, SIGSUSP}
.
전화하면 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}
이는 차단 세트의 이전 값이기 때문입니다.