当前位置: 首页 > article >正文

嵌入式Linux:信号集

目录

1、信号集初始化

2、向信号集中添加或删除信号

3、测试信号是否在信号集中


在 Linux 系统中,处理多个信号时常用到一种数据结构:信号集(sigset_t)。信号集允许我们将多个信号组织在一起,以便在系统调用中传递和操作。例如,sigaction()sigprocmask()sigpending() 等系统调用都使用信号集作为参数。

信号集的数据结构定义如下:

#define _SIGSET_NWORDS (1024 / (8 * sizeof(unsigned long int)))
typedef struct {
    unsigned long int __val[_SIGSET_NWORDS];
} sigset_t;

这个结构体可以表示一组信号。_SIGSET_NWORDS 计算了信号集数组所需的长整型数目,以便能够容纳所有可能的信号。

1、信号集初始化

sigemptyset() 用于初始化信号集,使其不包含任何信号。函数原型如下:

#include <signal.h>
int sigemptyset(sigset_t *set);

参数:

  • set: 指向需要初始化的信号集变量的指针。

返回值:

  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno

使用示例如下:

#include <signal.h>

int main() {
    sigset_t sig_set;
    if (sigemptyset(&sig_set) == -1) {
        perror("sigemptyset");
        return 1;
    }
    // 现在 sig_set 不包含任何信号
    return 0;
}

sigfillset() 用于初始化信号集,使其包含所有信号,包括所有实时信号。函数原型如下:

#include <signal.h>
int sigfillset(sigset_t *set);

参数:

  • set: 指向需要初始化的信号集变量的指针。

返回值:

  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno

使用示例如下:

#include <signal.h>

int main() {
    sigset_t sig_set;
    if (sigfillset(&sig_set) == -1) {
        perror("sigfillset");
        return 1;
    }
    // 现在 sig_set 包含所有信号
    return 0;
}

2、向信号集中添加或删除信号

sigaddset() 用于将一个信号添加到信号集中。函数原型如下:

#include <signal.h>
int sigaddset(sigset_t *set, int signum);

参数:

  • set: 指向信号集的指针。
  • signum: 要添加的信号。

返回值:

  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno

使用示例如下:

#include <signal.h>

int main() {
    sigset_t sig_set;
    if (sigemptyset(&sig_set) == -1) {
        perror("sigemptyset");
        return 1;
    }
    if (sigaddset(&sig_set, SIGINT) == -1) {
        perror("sigaddset");
        return 1;
    }
    // 现在 sig_set 包含 SIGINT 信号
    return 0;
}

sigdelset() 用于将一个信号从信号集中删除。函数原型如下:

#include <signal.h>
int sigdelset(sigset_t *set, int signum);

参数:

  • set: 指向信号集的指针。
  • signum: 要删除的信号。

返回值:

  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno

使用示例如下:

#include <signal.h>

int main() {
    sigset_t sig_set;
    if (sigfillset(&sig_set) == -1) {
        perror("sigfillset");
        return 1;
    }
    if (sigdelset(&sig_set, SIGINT) == -1) {
        perror("sigdelset");
        return 1;
    }
    // 现在 sig_set 不包含 SIGINT 信号
    return 0;
}

3、测试信号是否在信号集中

sigismember() 用于测试某个信号是否在指定的信号集中。函数原型如下:

#include <signal.h>
int sigismember(const sigset_t *set, int signum);

参数:

  • set: 指向信号集的指针。
  • signum: 要测试的信号。

返回值:

  • 如果信号 signum 在信号集 set 中,则返回 1。
  • 如果信号 signum 不在信号集 set 中,则返回 0。
  • 失败时返回 -1,并设置 errno

以下示例中,我们首先初始化了一个空的信号集,然后添加了 SIGINT 信号,并使用 sigismember() 函数检查信号集是否包含 SIGINT 信号。

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

int main() {
    sigset_t sig_set;
    if (sigemptyset(&sig_set) == -1) {
        perror("sigemptyset");
        return 1;
    }
    if (sigaddset(&sig_set, SIGINT) == -1) {
        perror("sigaddset");
        return 1;
    }

    if (sigismember(&sig_set, SIGINT)) {
        puts("信号集中包含 SIGINT 信号");
    } else {
        puts("信号集中不包含 SIGINT 信号");
    }

    return 0;
}

http://www.kler.cn/news/337203.html

相关文章:

  • C++学习笔记----8、掌握类与对象(六)---- 操作符重载(1)
  • Conda答疑
  • 人工智能新闻和发展 (24001)- By 10/4/2024
  • 一天认识一个硬件之交换机
  • 边缘人工智能(Edge Intelligence)
  • 基于Vue3+pinia+vue-router+axios+element-plus等开发的新闻发布管理系统
  • 【Java】springboot 项目中出现中文乱码
  • 基于pytorch的手写数字识别-训练+使用
  • 【ubuntu】ubuntu20.04安装conda
  • 【树莓派5B】IO串口通信使用
  • 软件测试面试题大全
  • JVM 内存布局
  • 用Python Turtle绘制天安门技术讲解
  • Python酷库之旅-第三方库Pandas(136)
  • 使用 Spring Boot 客户端对 Apache Pulsar 进行自定义身份验证
  • 【EXCEL数据处理】000017 案例 保姆级教程,附多个操作案例。EXCEL Match和Index函数。
  • 柯桥生活口语学习之在化妆品店可以用到的韩语句子
  • Selenium 和 Playwright 两者的区别与选择
  • 如何在各大地图平台上标注店铺定位?
  • IDEA的lombok插件不生效了?!!