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

devtools/2024/10/22 10:34:00/

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/devtools/127806.html

相关文章

flask基础学习

一、Python之flask、Django、Tornado框架 一&#xff09;django 主要是用来搞快速开发的&#xff0c;他的亮点就是快速开发&#xff0c;节约成本。 正常的并发量不过10000&#xff0c;如果要实现高并发的话&#xff0c;就要对django进行二次开发&#xff0c;比如把整个笨重的框…

Docker compose 安装Jenkins

Docker 安装Jenkins 1. 编写 jenkins-compose.yml 文件2. 部署compose3. 访问Jenkins4. 获取初始化密码5. 常用管理命令 1. 编写 jenkins-compose.yml 文件 编辑文件 vim /data/jenkins/jenkins-compose.yml写入以下内容 # 定义Compose文件版本 version: 3# 定义服务 servic…

Linux服务器前后端项目部署vue+springboot—搭建服务器上的运行环境(JDK、Redis、MySQL、Nginx)

Linux服务器前后端项目部署—①搭建服务器上的运行环境 一、系统参数信息和使用工具 1、服务器信息 华为云 CenteOS7.8 64 配置信息&#xff1a;2核4G 2、使用工具 Xshell6 二、环境安装和配置 &#xff08;一&#xff09;JDK的下载和安装 1、创建一个新目录或者进入目…

Java集合(3:Set和Map)

文章目录 Set概述哈希值HashSet去重原理LinkedHashSetTreeSet自定义排序规则 Map概述Map的基本方法Map集合的获取功能哈希表HashMap底层源码 特点注意 Set 概述 Set集合也是一个接口&#xff0c;继承自Collection&#xff0c;与List类似&#xff0c;都需要通过实现类来进行操…

Electron兼容win7版本的打包流程

Electron 兼容 Windows 7 版本的应用程序的打包流程是一个系统而规范的过程&#xff0c;旨在确保所生成的可执行文件能够在目标操作系统上稳定且高效地运行。以下是该流程的具体步骤&#xff1a; 1、 环境准备&#xff1a; 确保开发环境中已安装Node.js&#xff08;13.14.0&am…

Ansible 自动化运维工具

自动化运维工具&#xff1a; pupetc/s架构&#xff0c;需要安装客户端和服务端saltstackc/s架构&#xff0c;需要安装客户端和服务端&#xff1b;python语言chefc/s架构&#xff0c;需要安装客户端和服务端Ansible不需要安装客户端&#xff0c;ssh连接客户端&#xff1b;pytho…

数据结构(8.3_2)——快速排序

算法思想&#xff1a; 设置两个指针&#xff0c;一个i指针初值为low和一个j指针初值为high&#xff0c;j指针从左往右移&#xff0c;当j指向的元素小于枢轴元素&#xff0c;将该元素放到枢轴元素左边&#xff0c;i指针从右往左移&#xff0c;当i指向的元素大于枢轴元素&#xf…

笔记:WPF中MarkupExtension使用的IServiceProvider参数都有哪些

一、目的&#xff1a;WPF中MarkupExtension使用的IServiceProvider参数都有哪些&#xff0c;都是做什么的 在 WPF 中&#xff0c;MarkupExtension 类的 ProvideValue 方法接受一个 IServiceProvider 参数。IServiceProvider 是一个服务定位器接口&#xff0c;允许你在运行时获取…