基于linux下的高并发服务器开发(第二章)- 2.24 信号集及相关函数

1.用户通过键盘 Ctrl + C, 产生2号信号SIGINT (信号被创建)

**2.信号产生但是没有被处理 (未决)

  • 在内核中将所有的没有被处理的信号存储在一个集合中 (未决信号集)
  • SIGINT信号状态被存储在第二个标志位上
  • 这个标志位的值为0, 说明信号不是未决状态
  • 这个标志位的值为1, 说明信号处于未决状态
    3.这个未决状态的信号,需要被处理,处理之前需要和另一个信号集(阻塞信号集),进行比较
  • 阻塞信号集默认不阻塞任何的信号
  • 如果想要阻塞某些信号需要用户调用系统的API**

**4.在处理的时候和阻塞信号集中的标志位进行查询,看是不是对该信号设置阻塞了

  • 如果没有阻塞,这个信号就被处理
  • 如果阻塞了,这个信号就继续处于未决状态,直到阻塞解除,这个信号就被处理**

以下信号集相关的函数都是对自定义的信号集进行操作。

int sigemptyset(sigset_t *set);

- 功能:清空信号集中的数据,将信号集中的所有的标志位置为0

- 参数:set,传出参数,需要操作的信号集

- 返回值:成功返回0, 失败返回-1

int sigfillset(sigset_t *set);

- 功能:将信号集中的所有的标志位置为1

- 参数:set,传出参数,需要操作的信号集

- 返回值:成功返回0, 失败返回-1

int sigaddset(sigset_t *set, int signum);

- 功能:设置信号集中的某一个信号对应的标志位为1,表示阻塞这个信号

- 参数:

- set:传出参数,需要操作的信号集

- signum:需要设置阻塞的那个信号

- 返回值:成功返回0, 失败返回-1

int sigdelset(sigset_t *set, int signum);

- 功能:设置信号集中的某一个信号对应的标志位为0,表示不阻塞这个信号

- 参数:

- set:传出参数,需要操作的信号集

- signum:需要设置不阻塞的那个信号

- 返回值:成功返回0, 失败返回-1

int sigismember(const sigset_t *set, int signum);

- 功能:判断某个信号是否阻塞

- 参数:

- set:需要操作的信号集

- signum:需要判断的那个信号

- 返回值:

1 : signum被阻塞

0 : signum不阻塞

-1 : 失败

cpp 复制代码
/*
    以下信号集相关的函数都是对自定义的信号集进行操作。

    int sigemptyset(sigset_t *set);
        - 功能:清空信号集中的数据,将信号集中的所有的标志位置为0
        - 参数:set,传出参数,需要操作的信号集
        - 返回值:成功返回0, 失败返回-1

    int sigfillset(sigset_t *set);
        - 功能:将信号集中的所有的标志位置为1
        - 参数:set,传出参数,需要操作的信号集
        - 返回值:成功返回0, 失败返回-1

    int sigaddset(sigset_t *set, int signum);
        - 功能:设置信号集中的某一个信号对应的标志位为1,表示阻塞这个信号
        - 参数:
            - set:传出参数,需要操作的信号集
            - signum:需要设置阻塞的那个信号
        - 返回值:成功返回0, 失败返回-1

    int sigdelset(sigset_t *set, int signum);
        - 功能:设置信号集中的某一个信号对应的标志位为0,表示不阻塞这个信号
        - 参数:
            - set:传出参数,需要操作的信号集
            - signum:需要设置不阻塞的那个信号
        - 返回值:成功返回0, 失败返回-1

    int sigismember(const sigset_t *set, int signum);
        - 功能:判断某个信号是否阻塞
        - 参数:
            - set:需要操作的信号集
            - signum:需要判断的那个信号
        - 返回值:
            1 : signum被阻塞
            0 : signum不阻塞
            -1 : 失败

*/
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

int main(){
    // 创建一个信号集
    sigset_t set;

    //清空信号集的内容
    sigemptyset(&set);
    
    //判断 SIGINT 是否在信号集 set里
    int ret = sigismember(&set,SIGINT);
    if(ret == 0){
        printf("SIGINT 不阻塞\n");
    }else if(ret == 1){
        printf("SIGINT 阻塞\n");
    }else if(ret == -1){
        perror("SIGINT");
        exit(0);
    }

    //添加几个信号到信号集中
    sigaddset(&set,SIGINT);
    sigaddset(&set,SIGQUIT);

    //判断SIGINT是否在信号集中
    ret = sigismember(&set,SIGINT);
    if(ret == 0){
        printf("SIGINT 不阻塞\n");
    }else if(ret == 1){
        printf("SIGINT 阻塞\n");
    }else if(ret == -1){
        perror("SIGINT");
        exit(0);
    }

    //判断SIGQUIT是否在信号集中
    ret = sigismember(&set,SIGQUIT);
    if(ret == 0){
        printf("SIGQUIT 不阻塞\n");
    }else if(ret == 1){
        printf("SIGQUIT 阻塞\n");
    }else if(ret == -1){
        perror("SIGQUIT");
        exit(0);
    }

    //从信号集中删除一个信号
    sigdelset(&set,SIGQUIT);

    //判断SIGQUIT是否在信号集中
    ret = sigismember(&set,SIGQUIT);
    if(ret == 0){
        printf("SIGQUIT 不阻塞\n");
    }else if(ret == 1){
        printf("SIGQUIT 阻塞\n");
    }else if(ret == -1){
        perror("SIGQUIT");
        exit(0);
    }

    return 0;
}
相关推荐
wefg14 分钟前
【Redis】安装与启动
数据库·redis·缓存
自养Agent7 分钟前
MCP Server Boundary Audit Report
linux·服务器·人工智能·windows·大模型·llm
大圣编蚕30 分钟前
常见的 Redis 面试题(高频整理)
数据库·redis·缓存
派小心.1 小时前
网站统计采样数据的误差核对
大数据·服务器·前端·数据库·人工智能·小程序·数据分析
Coisinier1 小时前
docker命令管理镜像及容器
linux·运维·nginx·docker·容器·操作系统
龙腾AI白云1 小时前
数字孪生、具身智能、世界模型三者交叉
数据库·人工智能·机器学习·flask·pygame
SelectDB技术团队2 小时前
Apache Doris 基于 Lance 的向量检索深度解析
数据库·数据仓库·数据分析·湖仓一体·apache doris·lakehouse·多模湖仓
A心有千千结2 小时前
通过 SSH 反向代理让服务器借用本机网络访问 GitHub 的最佳实践
linux·服务器·网络·git·ssh·github
fengkai45452 小时前
十三、Zabbix 监控
运维·服务器·zabbix·监控·网络设备
这个DBA有点耶2 小时前
从INDEX到JOIN_ORDER:MySQL 8.0 Hint语法体系与五类实战场景
数据库·mysql·架构