나는 작은 코드를 작성했습니다. 이 코드는 먼저 {SIGSEGV}를 차단 한 다음 SIGRTMIN을 동일한 세트에 추가합니다. 그래서, 최종 신호 세트는 {SIGSEGV, SIGRTMIN}입니다. 따라서, 만약 내가 SIG_UNBLOCK을 사용한다면, SIGRTMIN은 차단 해제되어야하고, 다시 SIG_UNBLOCK을 호출하면 SIGSEGV는 차단 해제되어야한다.sigprocmask()는 UNIX에서 신호를 차단합니다.
즉, 1) {SIGSEGV, SIGRTMIN} 2) SIG_UNBLOCK = SIGRTMIN 차단 해제 3) 다시 SIG_UNBLOCK = SIGSEGV 차단 해제를 호출합니다. 나는 프로세스에게 SIGRTMIN만을 부여하고있다. 따라서 두번째 unblock은 SIGRTMIN으로 프로세스를 정지시켜야한다. 그러나 그렇지 않습니다. 도와주세요. N.B : sigprocmask()에서 다른 질문의 대답에 대한 링크를 제공하지 마십시오. 나는 그것을 보았고 질문을 명확히하지 않습니다.
enter code here
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
sigset_t old_set,new_set;
sigemptyset(&old_set);
sigemptyset(&new_set);
if(sigaddset(&old_set,SIGSEGV)==0)
{
printf("sigaddset successfully added for SIGSEGV\n");
}
sigprocmask(SIG_BLOCK,&old_set,NULL); // SIGSEGV signal is masked
kill(0,SIGSEGV);
//*****************************************************************
if(sigaddset(&new_set,SIGRTMIN)==0)
{
printf("sigaddset successfully added for SIGRTMIN\n");
}
sigprocmask(SIG_BLOCK,&new_set,&old_set); // SIGRTMIN signal is masked
kill(0,SIGSEGV);
//****************** Unblock one signal at a time ******************
sigprocmask(SIG_UNBLOCK,&new_set,&old_set); // SIGRTMIN signal is unmasked
sigprocmask(SIG_UNBLOCK,&new_set,&old_set); // SIGSEGV signal is unmasked
}
Output:
[[email protected] signals]# ./a.out
sigaddset successfully added for SIGSEGV
sigaddset successfully added for SIGRTMIN
(Note:SIGSEGV is not received even after sigprocmask(SIG_UNBLOCK,&new_set,&old_set); a second time)
@kubi : 왜 SIGSEGV를 수신하지 못합니까? – kingsmasher1
@ kubi : 아니요. 전체 세트가 한 번에 차단 해제되지 않는다고 생각합니다. 링크 (http://stackoverflow.com/questions/25261/help-with-sigprocmask)를 확인하십시오. 게다가 sigprocmask() 자체는 블로킹이나 블럭킹을하지 않으므로 블럭킹, 블럭킹 또는 마스크를 수행하는 인자 또는 첫 번째 매개 변수입니다. 그래서 제 잘못을 지적하기 전에 생각하십시오. – kingsmasher1
@ kingsmasher1 : 어떻게'SIGSEGV'를 다루고 있습니까? 신호 처리기 코드 스 니펫을 붙여 넣을 수 있습니까? 신호가 올바르게 전송됩니까? 'sigprocmask'와'kill'의 에러 코드를 확인하십시오. – kubi