Linux系统应用编程---信号处理函数(sigprocmask、sigpending函数)

信号集处理函数

 int sigemptyset(sigset_t *set);                         清空信号集,将信号集全部置0

int sigfillset(sigset_t *set);                                 将信号集全部置1

int sigaddset(sigset_t *set, int signo)                把信号集的某一个信号位置1

int sigdelset(sigset_t *set, int signo);                 把信号集的某一个信号位置0;

int sigismember(const sigset_t *set, int signo);  判断这个信号集的某个信号位是否置位

sigprocmask函数

一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。调用函数sigprocmask可以检测或更改其信号屏蔽字,或者在一个步骤中同时执行这两个操作。

#include <signal.h>

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

首先,若oldset是非空指针,那么进程的当前信号屏蔽字通过oldset返回。

其次,若set是一个非空指针,则参数how指示如何修改当前信号屏蔽字。

若set是空指针,则不改变该进程的信号屏蔽字,how的值也无意义了。

下面表格说明了how可选用的值。注意,不能阻塞SIGKILL和SIGSTOP信号。

How参数

说明

SIG_BLOCK

该进程新的信号屏蔽字是其当前信号屏蔽字和set指向信号集的的并集,set包含了我们希望阻塞的附加信号

SIG_UNBLOCK

该进程新的信号屏蔽字是其当前信号屏蔽字和set指向信号补集的交集,set包含了我们希望解除阻塞的信号

SIG_SETMASK

该进程新的信号屏蔽字将被set指向的信号集的值代替

返回值:成功返回0,出错返回-1

 

sigpending函数

#include <signal.h>

int sigpending(sigset_t *set);

sigpending读取当前进程的未决信号集,通过set参数传出。调用成功则返回0,出错则返回-1。

 

程序:通过sigprocmask设置要阻塞的信号,通过sigpending打印已经阻塞的信号,并在终端输出

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void printsigset(const sigset_t *set)
{
	int i ;
	for(i=1; i<32; i++)
		if(sigismember(set, i) == 1)	//判断信号集是否置位
			putchar('1');
		else
			putchar('0');
	puts("");
}

int main(void)
{
	sigset_t s, p;
	sigemptyset(&s);					//清空信号集
	sigaddset(&s, SIGINT);				//将信号位2:SIGINT置1
	sigprocmask(SIG_BLOCK, &s, NULL);	//在信号集中添加刚才sigaddset的SIGINT信号阻塞
	while(1){
		sigpending(&p);					//调用sigpending读取当前进程未决信号集
		printsigset(&p);
		sleep(1);
	}
	return 0;
}

执行结果如下:在键盘上按Ctrl+C可以产生SIGINT信号

猜你喜欢

转载自blog.csdn.net/weixin_42445727/article/details/89054197