← 返回首页
Linux高级程序设计(四十三)
发表时间:2021-11-26 20:42:45
信号集

为了方便对多个信号进行处理,一个用户进程常常需要对多个信号做出处理,在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
}