欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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】中的进程信号三张表