为了方便对多个信号进行处理,一个用户进程常常需要对多个信号做出处理,在Linux 系统中引入了信号集(信号的集合)。
信号集是用来表示多个信号的数据类型(sigset_t),其定义路径为:/usr/include/bits/sigset.h。 通过以下命令查看:
cat /usr/include/bits/sigset.h
1.常用信号集函数
#include <signal.h>
//初始化一个空信号集
int sigemptyset(sigset_t *set);
//初始化一个满的信号集
int sigfillset(sigset_t *set);
//判断某个信号是否在信号集中
int sigismember(const sigset_t *set, int signum);
//添加信号到信号集
int sigaddset(sigset_t *set, int signum);
//从信号集中删除某个信号
int sigdelset(sigset_t *set, int signum);
实例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
int main(int argc, char *argv[])
{
// 信号集合
sigset_t set;
int ret = 0;
sigemptyset(&set); // 清空信号集合
ret = sigismember(&set, SIGINT);
if (ret == 0)
{
printf("SIGINT is not in signal set!\n");
}
sigaddset(&set, SIGINT); // SIGINT 加入 set 集合
sigaddset(&set, SIGQUIT);
ret = sigismember(&set, SIGINT);
if (ret == 1)
{
printf("SIGINT is in signal set!\n");
}
sigdelset(&set,SIGINT); //把SIGINT从集合中删除
ret = sigismember(&set, SIGINT);
if (ret == 0)
{
printf("SIGINT is not in signal set!\n");
}
return 0;
}
运行结果:
[root@iz2zefozq9h39txdb8s7npz shelldemo]# ./a.out
SIGINT is not in signal set!
SIGINT is in signal set!
SIGINT is not in signal set!
如果在vscode下提示sigset_t 不识别,可以配置c_cpp_properties.json,把cStandard属性设置为"gnu99",如下:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu99",
"cppStandard": "gnu++98",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}