문제

사용법을 완전히 이해하지 못했습니다. 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}

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top