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

news2024/11/26 11:44:14

 

 

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 : 失败

 

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

    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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

概率论和随机过程的学习和整理--番外15,如何计算N合1的合成数量问题?

目录 1 目标问题&#xff1a;多阶2合1的合成问题 1.1 原始问题 1.2 合成问题要注意&#xff0c;合成的数量 1.3 合成问题不能用马尔科夫链来解决 2 方案1&#xff1a;用合成公式合成多次能解决吗&#xff1f; --不能&#xff0c;解决不了递归的问题 3 方案2&#xff0c;…

微分流形2:流形上的矢量场和张量场

来了来了&#xff0c;切向量&#xff0c;切空间。流形上的所有的线性泛函的集合&#xff0c;注意是函数的集合。然后取流形上的某点p&#xff0c;它的切向量为&#xff0c;线性泛函到实数的映射。没错&#xff0c;是函数到实数的映射&#xff0c;是不是想到了求导。我们要逐渐熟…

uni-app 微信小程序:启用组件按需注入

uni-app 微信小程序&#xff1a;启用组件按需注入 文章目录 uni-app 微信小程序&#xff1a;启用组件按需注入一、官方文档按需注入注意事项 二、HBuilder X 设置三、效果 一、官方文档 https://developers.weixin.qq.com/miniprogram/dev/framework/ability/lazyload.html 按…

大数据面试题:HBase读写数据流程

面试题来源&#xff1a; 《大数据面试题 V4.0》 大数据面试题V3.0&#xff0c;523道题&#xff0c;679页&#xff0c;46w字 参考答案&#xff1a; 1、写数据流程 1&#xff09;Client先访问zookeeper&#xff0c;获取hbase:meta表位于哪个Region Server。 2&#xff09;访…

MySQL的主从复制练习

基本原理图如下&#xff1a; 主从复制&#xff08;也称 AB 复制&#xff09;允许将来自一个MySQL数据库服务器&#xff08;主服务器&#xff09;的数据复制到一个或多个MySQL数据库服务器&#xff08;从服务器&#xff09;。当主库进行更新的时候&#xff0c;会自动将数据复制到…

【youcans动手学模型】目标检测之 RCNN 模型

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans动手学模型】目标检测之 RCNN 模型 1. R-CNN 目标检测1.1 论文摘要1.2 技术背景1.3 基本方法1.4 算法实现1.5 总结 2. 使用 PyTorch 实现 RCNN 目标检测2.1 训练 AlexNet 模型2.2 微调 Alex…

《个人理财》——第六章 理财规划计算工具与方法

考点1&#xff1a; 货币时间价值概述 货币时间价值 也叫资金的时间价值 • 货币在无风险条件下&#xff0c; 经历一定时间投资和再投资发生的增值 • 同等数量货币或现金流的未来价值更低 • 不同时间单位的货币不具有可比性 产生的原因• 现有货币用于投资&#xff0c; 可获得…

IDEA+SpringBoot +ssm+ Mybatis+easyui+Mysql求职招聘管理系统网站

IDEASpringBoot ssm MybatiseasyuiMysql求职招聘管理系统网站 一、系统介绍1.环境配置 二、系统展示1. 登录2.注册3.首页4.公司5.关于我们6.我的简历7.我投递的简历8.修改密码9. 管理员登录10.我的信息11.用户信息12.职位类别13. 职位列表14. 公司列表15. 日志列表 三、部分代码…

听GPT 讲K8s源代码--pkg(八)

k8s项目中 pkg/kubelet/envvars&#xff0c;pkg/kubelet/events&#xff0c;pkg/kubelet/eviction&#xff0c;pkg/kubelet/images&#xff0c;pkg/kubelet/kubeletconfig这些目录都是 kubelet 组件的不同功能模块所在的代码目录。 pkg/kubelet/envvars 目录中包含了与容器运行…

深度学习入门教学——神经网络

深度学习就是训练神经网络。 1、什么是神经网络&#xff1f; 举个最简单的例子&#xff0c;以下是一个使用线性回归来预测房屋价格的函数。这样一个用于预测房屋价格的函数被称作是一单个神经元。大一点的神经网络&#xff0c;就是将这些单个神经元叠加起来。例如&#xff1a…

Java基础之stream流最新版,stream流的基本操作

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

java 应用 cpu 过高故障排查

文章目录 一、前言二、测试代码 Test.java三、Linux 编译运行 Test.java 程序四、top 命令查看 cpu 使用情况五、查看进程下的线程详情 top -H -p 11748六、将线程 12240 的 pid 转为 16 进制 printf "0x%x\n" 12240七、jstack 查看进程的快照遗留 一、前言 前两天…

二十六章:Pyramid Vision Transformer ——金字塔视觉Transformer:一种无卷积的用于密集预测的多功能主干网络

0.摘要 虽然卷积神经网络&#xff08;CNN&#xff09;在计算机视觉领域取得了巨大成功&#xff0c;但本研究探讨了一种更简单、无卷积的骨干网络&#xff0c;适用于许多密集预测任务。与最近提出的专门用于图像分类的Vision Transformer&#xff08;ViT&#xff09;不同&#x…

无人机自主探索FUEL:代码阅读1--边界簇检测更新与视点生成

~/src/catkin_fuel_refactored/fuel_refactored/fuel_planner/bagbag中包含三个.sh文件&#xff0c;为rosbag指令&#xff0c;给出了录包指令以及有用话题信息 FIS 1、增量边界检测与聚类 路径&#xff1a;~/fuel_planner/active_perception/src/frontier_finder.cpp 主要函…

五、模型训练

目录 1. 线性模型1.1 Lasso 回归1.2 Ridge 回归 2. 树模型2.1 随机森林&#xff08;Random Forest&#xff0c;RF&#xff09;2.2 梯度提升树&#xff08;GBDT&#xff09;2.3 XGBoost2.4 LightGBM2.5 CatBoost2.6 模型深入对比 3. 神经网络3.1 多层感知机3.2 卷积神经网络3.3 …

Linux 下 nc 发送接收 udp、tcp数据

nc&#xff0c;全名叫 netcat&#xff0c;它可以用来完成很多的网络功能&#xff0c;譬如端口扫描、建立TCP/UDP连接&#xff0c;数据传输、网络调试等等&#xff0c;因此&#xff0c;它也常被称为网络工具的 瑞士军刀 。 一、只服务端使用nc 备注&#xff1a;这种方式只能发…

【Hive】Centos7安装单机版Hive

Hive依赖MySQL存储元数据信息&#xff0c;安装Hive前需要先安装MySQL 一、安装MySQL 下载mysql安装包 wget http://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm2. 如果不是root用户需要先切换到root用户&#xff0c;安装第1步下载的rpm包 yum -y install …

MYSQL练习一答案

练习1答案 构建数据库 数据库 数据表 answer开头表为对应题号答案形成的数据表 表结构 表数据 答案&#xff1a; 1、查询商品库存等于50的所有商品&#xff0c;显示商品编号&#xff0c;商 品名称&#xff0c;商品售价&#xff0c;商品库存。 SQL语句 select good_no,good…

数据结构07:查找[C++][B树Btree]

图源&#xff1a;文心一言 考研对于B树的要求重点在推理手算的部分&#xff0c;只参考王道论坛咸鱼老师的视频就可以了&#xff1b;若时间非常充裕的小伙伴&#xff0c;也可以往下滑了解一下代码~&#x1f95d;&#x1f95d; 备注&#xff1a; 这次的代码是从这里复制的&…