【C语言教程】【常用类库】(十二)信号处理库 - <signal.h>

server/2024/10/18 20:49:47/

12. 信号处理库 - <signal.h>

在 C 语言中,信号处理是一个重要的机制,它允许程序在运行时响应各种异步事件。通常用于处理如中断,退出信号,以及来自操作系统或其他程序的通信信号。本章将深入探讨信号处理的基础知识和高级用法。

12.1. 基础信号处理
12.1.1. 信号概述与默认行为

信号是进程间和操作系统与进程间通信的一种机制。信号可以通知进程某些事件的发生。

  • 常见信号

    • SIGINT:中断信号(通常从键盘输入 Ctrl+C 生成)。
    • SIGTERM:终止信号,常用于请求程序正常终止。
    • SIGKILL:强制终止信号,无法被捕获或忽略。
    • SIGSEGV:段错误信号,通常由非法内存访问引发。
  • 默认行为:信号具有默认处理行为,例如终止进程、忽略信号或生成转储文件。

12.1.2. 信号处理函数:signal

signal 函数用于捕获信号并指定自定义处理行为。通过设置信号处理函数,程序可以在捕获到信号时执行特定的代码。

#include <stdio.h>
#include <signal.h>void sigint_handler(int signum) {printf("Caught SIGINT (signal %d). Cleaning up...\n", signum);
}int main() {// 注册信号处理函数signal(SIGINT, sigint_handler);// 无限循环等待信号while (1) {printf("Running...\n");sleep(1);}return 0;
}

在上面的代码中,当程序收到 SIGINT 信号(通常通过 Ctrl+C 触发)时,将调用 sigint_handler 函数。

12.2. 高级信号管理
12.2.1. sigaction 的使用

sigaction 是一个更高级的信号处理接口,相较于 signal 提供了更细粒度的信号管理。

  • 基本用法:能够查看、设置信号处理的详细行为。
#include <stdio.h>
#include <signal.h>
#include <string.h>void sigterm_handler(int signum) {printf("Caught SIGTERM (signal %d). Terminating gracefully...\n", signum);
}int main() {struct sigaction sa;memset(&sa, 0, sizeof(sa));sa.sa_handler = sigterm_handler;// 使用 sigaction 设置信号处理sigaction(SIGTERM, &sa, NULL);// 无限循环等待信号while (1) {printf("Running...\n");sleep(1);}return 0;
}

在此代码中,我们使用 sigaction 来捕获并处理 SIGTERM 信号。

12.2.2. 自定义信号处理器示例

通过自定义信号处理函数,程序可以在处理信号时执行特定的清理或日志记录操作,从而确保资源得到合理释放,使程序能够正确地应对异常情况。

12.2.3. sigset_t 信号集操作

sigset_t 是用于表示信号集的数据类型。操作信号集的常用函数包括 sigemptysetsigfillsetsigaddsetsigdelsetsigismember。这些函数可以用来灵活地定制信号处理行为,例如阻塞和解除阻塞特定的信号。

#include <stdio.h>
#include <signal.h>void print_signal_set(sigset_t *set) {int i;for (i = 1; i < NSIG; i++) { // NSIG: 信号总数if (sigismember(set, i))printf("Signal %d is in the set.\n", i);}
}int main() {sigset_t set;sigemptyset(&set); // 初始化空信号集// 添加 SIGINT 和 SIGTERM 到信号集sigaddset(&set, SIGINT);sigaddset(&set, SIGTERM);// 打印信号集内容print_signal_set(&set);return 0;
}

通过掌握这些技术,程序员可以更好地控制程序对信号的响应,确保程序的健壮性和可靠性。


http://www.ppmy.cn/server/132860.html

相关文章

从零开始的架构图艺术之路

目录 1、前言2、图例2.1 业务介绍图2.2 技术链路图 3、如何画好一张图3.1 设计感3.1.1 设计四大原则 3.2 美感3.2.1 色轮运用3.2.2 黄金分割 3.3 完整感3.3.1 以终为始、用户为先 4、绘图小工具4.1 阿里巴巴矢量图库4.2 Coloraa颜色大全4.3 配色表 1、前言 该文主要分享一个锦…

2024年软件设计师中级(软考中级)详细笔记【6】结构化开发方法(分值3~4)

目录 前言6.1 系统分析与设计概述6.1.2 系统设计的基本原理6.1.3 系统总体结构设计6.1.4 系统文档6.2.2 数据流图6.2.3 数据字典&#xff08;DD&#xff09; 6.5 用户界面设计6.5.1 用户界面设计的黄金原则杂题习题&#xff1a; 结语 前言 在备考软件设计师中级考试的过程中&a…

安卓13禁止锁屏 关闭锁屏 android13禁止锁屏 关闭锁屏

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.彩蛋1.前言 设置 =》安全 =》屏幕锁定 =》 无。 我们通过修改系统屏幕锁定配置,来达到设置屏幕不锁屏的配置。像网上好多文章都只写了在哪里改,改什么东西,但是实际上并未写明为什么要改那…

【适用于Mac】MySQL忘记密码卸载重新安装

因为MySQL忘记密码了&#xff0c;卸载重新安装了一下&#xff0c;记录一下过程 步骤 1: 安装 Homebrew 如果你还没有安装 Homebrew&#xff0c;可以通过以下命令来安装 Homebrew&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/i…

PMP--必刷题–解题–51-60

文章目录 51、 [单选] 项目B的一个领导一直向项目A的一个团队成员寻求帮助。项目A的项目经理应该怎么做&#xff1f; 4.整合管理--变更控制流程--52、 [单选] 业务经理和产品负责人要求以更灵活的方式将更改纳入产品基线。与其他供应商相比&#xff0c;他们担心失去进入市场的时…

在线书画展:艺术与科技携手,拓宽艺术之路

在数字化浪潮的推动下&#xff0c;在线书画展正成为艺术与科技完美融合的典范。它不仅拓宽了艺术的传播渠道&#xff0c;提升了个人书画家的开展效率&#xff0c;还促进了艺术家们的职业发展。以下是对在线书画展几大优势的深入探讨。 一、拓宽艺术传播渠道 全球化展示&#x…

private field is never assigned

文章目录 问题现象解决办法 问题现象 在IDEA中&#xff0c;代码中注入的属性提示private field is never assigned&#xff0c;入下图所示。该提示意思是私有字段没有被分配赋值。 解决办法 可以点击Add constructor parameter来解决&#xff0c;即添加带有参数的构造器&…

前端工具函数库

流行的前端工具函数库 lodashlodash-es&#xff1a;用lodash-es代替lodashes-toolkit&#xff1a;https://www.npmjs.com/package/es-toolkitradash&#xff1a;https://github.com/sodiray/radash 补充信息&#xff1a; antd-mobile 已不再依赖 lodash&#xff0c; 淘汰 lo…