Linux之信号集

Posted studying~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之信号集相关的知识,希望对你有一定的参考价值。

信号集概述 一个用户进程常常需要对多个信号做出处理。为了方便对多个信号进行处理,在Linux 系统中引入了信号集。 信号集是用来表示多个信号的数据类型。

信号集数据类型 sigset_t

定义路径:
/usr/include/i386-linux-gnu/bits/sigset.h (ubuntu 12.04)
/usr/include/x86_64-linux-gnu/bits/sigset.h (ubuntu16.04)


信号集相关的操作主要有如下几个函数:
sigemptyset
sigfillset
sigismember
sigaddset
sigdelset

包含头文件:#include <signal.h>

sigemptyset 函数 初始化一个空的信号集
int sigemptyset(sigset_t *set);
功能:初始化由 set 指向的信号集,清除其中所有的信号即初始化一个空信号集。
参数:set:信号集标识的地址,以后操作此信号集,对 set 进行操作就可以了。
返回值: 成功:返回 0 失败:返回 -1

sigfillset 函数 初始化一个满的信号集
int sigfillset(sigset_t *set);
功能:初始化信号集合 set, 将信号集合设置为所有信号的集合。
参数:set:信号集标识的地址,以后操作此信号集,对 set 进行操作就可以了。
返回值: 成功:返回 0 失败:返回 -1

sigaddset 函数 向某个集合中添加一个信号
int sigaddset(sigset_t *set, int signum);
功能:将信号 signum 加入到信号集合 set 之中。
参数:set:信号集标识的地址。 signum:信号的编号。
返回值: 成功返回 0,失败返回 -1。

sigdelset 函数 从某个信号集中删除一个信号
int sigdelset(sigset_t *set, int signum);
功能:将 signum 所标识的信号从信号集合 set 中删除。
参数:set:信号集标识的地址。 signum:信号的编号。
返回值: 成功:返回 0 失败:返回 -1

sigismember 函数 判断某个集合中是否有某个信号
int sigismember(const sigset_t *set,int signum);
功能:查询 signum 标识的信号是否在信号集合 set 之中。
参数:set:信号集标识符号的地址。 signum:信号的编号。
返回值: 在信号集中返回 1,不在信号集中返回 0 错误

案例:创建一个空的信号集合,向集合中添加信号,判断集合中是否有这个信号

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

int main(int argc, char *argv[])
{
    //创建一个信号集
	sigset_t set;
	int ret = 0;

    //初始化一个空的信号集
	sigemptyset(&set);

    //判断SIGINT信号是否在信号集中
	ret = sigismember(&set, SIGINT);
	if(ret == 0)
    {
		printf("SIGINT is not a member of sigprocmask \\nret = %d\\n", ret);
    }	
	
    //将指定的信号添加到信号集中
    sigaddset(&set, SIGINT);
	sigaddset(&set, SIGQUIT);
	
	ret = sigismember(&set, SIGINT);
	if(ret == 1)
	{	
        printf("SIGINT is a member of sigprocmask \\nret = %d\\n", ret);
    }
    
	return 0;
}

执行结果:

以上是关于Linux之信号集的主要内容,如果未能解决你的问题,请参考以下文章

linux进程间通信之Posix 信号量用法详解代码举例

Linux 进程管理命令之kill

Linux----信号

c_cpp Linux的信号集操作,操作信号屏蔽字(阻塞信号集),读取未决信号集

Linux 之 信号

Linux 之 信号