私は小さなコードを書きました。このコードは、最初に {SIGSEGV} をブロックし、次に SIGRTMIN を同じセットに追加します。最終的なシグナル セットは {SIGSEGV,SIGRTMIN} です。したがって、SIG_UNBLOCK を使用する場合、私の理解では、最初に SIGRTMIN のブロックを解除し、次に SIG_UNBLOCK を呼び出すと、SIGSEGV のブロックを解除する必要があります。
つまり、1) {SIGSEGV,SIGRTMIN} 2) SIG_UNBLOCK = SIGRTMIN のブロックを解除します。3) SIG_UNBLOCK を再度呼び出します = SIGSEGV のブロックを解除します。プロセスに SIGRTMIN のみを与えているため、2 回目のブロック解除は SIGRTMIN でプロセスを停止する必要があります。そうではありません。助けてください。 注意: 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:
[root@dhcppc0 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)