【Linux】中的进程信号三张表
程序员文章站
2022-07-12 10:30:15
...
信号的递达(Delivery):
指的就是实际执行行信号的处理动作,而递达即处理有三种方式,分别是:
1.忽略信号2.执行默认动作(一般是终止进程)
3.自定义动作(捕捉信号)
信号未决(Pending):
指的是信号从产生生到递达之间的状态,。
阻塞(Block ):
让某个信号可以接收,但是会一直处于信号未决状态,无法递达除非解除阻塞。解除阻塞后才执行行递达的动作。
注意:阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。每个信号都有两个标志位分别表示示阻塞(block)和未决(pending),还有一一个函数指针表示示处理
动作。信号产生生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标
志。
编写代码:
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>
void myhandler(int signal)
{
printf("当前进程ID为:%d,收到 %d 信号\n",getpid(),signal);
}
void showPending(sigset_t *pending)
{
int i=1;
while(i<=31)
{
if(sigismember(pending,i)==1)
{
printf("1");
}
else
{
printf("0");
}
++i;
}
printf("\n");
}
int main()
{
sigset_t set,oset;
sigemptyset(&set);
sigemptyset(&oset);
sigaddset(&set,2);
sigprocmask(SIG_SETMASK,&set,&oset);
signal(2,myhandler);
int count=0;
sigset_t pending;
while(1)
{
sigpending(&pending);
showPending(&pending);
sleep(1);
if(count==3)
{
sigprocmask(SIG_SETMASK,&oset,NULL);
count=0;
}
count++;
}
return 0;
}
运行结果:
上一篇: Linux信号集
下一篇: Linux中关于信号的一些知识