我寫了一小段代碼。此代碼首先阻止{SIGSEGV},然後將SIGRTMIN添加到同一組。所以,我最後的信號集是{SIGSEGV,SIGRTMIN}。因此,如果我使用SIG_UNBLOCK,按照我的理解,首先SIGRTMIN應該被解除阻塞,然後再次如果我調用SIG_UNBLOCK,SIGSEGV應該被解除阻塞。即,1){SIGSEGV,SIGRTMIN} 2)SIG_UNBLOCK =解鎖SIGRTMIN,3)再次調用SIG_UNBLOCK =解鎖SIGSEGV。 我只給SIGRTMIN一個進程,因此我的第二個unblock應該用SIGRTMIN停止進程。但事實並非如此。請幫忙。 N.B:請不要給出關於sigprocmask()上其他問題的答案的鏈接,我已經看到他們,他們也沒有澄清我的問題。sigprocmask()在UNIX中阻止信號
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 2011-03-13 10:57:56
@ kubi:不,我不認爲整套遊戲一次就能暢通無阻。檢查鏈接:http://stackoverflow.com/questions/25261/help-with-sigprocmask。此外,sigprocmask()本身不會阻塞或解除阻塞,它是使阻塞,解除阻塞或屏蔽的參數或第一個參數。所以,在指出我錯誤之前請先思考。 – kingsmasher1 2011-03-13 10:59:49
@ kingsmasher1:你如何處理'SIGSEGV'?你能粘貼一個信號處理程序代碼片段嗎?信號是否被正確發送?檢查「sigprocmask」和「kill」的錯誤代碼。 – kubi 2011-03-13 11:05:20