#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void PrintSet(sigset_t*ped)
{
for(int i=1;i<32;++i)
(sigismember(ped,i)>0)? putchar('1'):putchar('0');
printf("\n");
}
void process(int sign)
{
if(sign!=SIGSEGV)
{
printf("clear SIGSEGV at mask!");
sigset_t myset;
sigemptyset(&myset);
sigaddset(&myset,SIGSEGV);
if(sigprocmask(SIG_UNBLOCK,&myset,NULL)<0)
perror("failed!");
}
else
printf("---------------------");
}
int main()
{
signal(SIGALRM,process);
signal(SIGSEGV,process);
sigset_t myset, ped;
sigemptyset(&myset);
sigaddset(&myset,SIGQUIT);
sigaddset(&myset,SIGINT);
sigaddset(&myset,SIGSEGV);
sigaddset(&myset,SIGTSTP);
if(sigprocmask(SIG_BLOCK,&myset,NULL)<0)
perror("failed!");
while(1)
{
sigpending(&ped);
PrintSet(&ped);
sleep(1);
};
return 0;
}
/*信号发送-处理流程
信号由内核产生并发送给指定的进程;进程根据其阻塞信号集判断是否处理此信号;如果处理此信号,未决信号集中的对应信号是一个瞬时的0-1-0;如果阻塞其信号,那么未决信号集中存储的是对应信号的编号状态为1;
未决信号集中的信号状态具有被处理的趋势,=>即若以后释放此信号在该进程中的阻塞信号集状态;未决信号中的未决状态信号将被处理;
信号处理三种方式:默认,忽略,用户自定义;但是如果信号被屏蔽,则不会进入到信号处理这一步;而是处于未决信号集中;一旦将来此信号对应的阻塞集被释放,才自动重新进入处理此信号阶段*/
Linux信号发送处理流程
于 2024-04-01 01:19:39 首次发布