非异步安全函数(禁止在信号处理中调用)

一、测试

在信号处理函数(Signal Handler)中,只有异步信号安全函数(async-signal-safe functions) 可以安全调用。这类函数的特点是:不使用全局状态、不依赖内部锁、不调用其他非安全函数,且能被信号中断后安全恢复。

非异步安全函数(禁止在信号处理中调用)

以下是常见的非异步安全函数分类及示例(覆盖大部分常用函数):

1. 内存分配 / 释放函数

这类函数依赖全局堆管理结构和内部锁,信号处理中调用可能导致堆损坏或死锁。

  • mallocfreerealloccalloc
  • posix_memalignaligned_alloc
2. 标准 I/O 函数

标准 I/O 库(stdio.h)函数使用全局缓冲区和锁,信号中断可能导致缓冲区状态不一致。

  • 输入输出:printffprintfsprintfsnprintfvprintfvfprintfvsprintfvsnprintf
  • 文件操作:fopenfclosefreadfwritefseekfflushfgetsfputs
  • 其他:perror(内部调用strerrorfprintf)、fflush
3. 字符串 / 字符处理函数(依赖静态缓冲区)

这类函数使用静态缓冲区存储结果,信号中断可能导致缓冲区内容被覆盖。

  • strtok(使用静态缓冲区存储分割状态)
  • strerror(部分实现使用静态缓冲区存储错误信息)
  • ctimeasctime(使用静态缓冲区存储时间字符串)
  • getpwuidgetpwnam(部分实现使用静态缓冲区存储用户信息)
  • getgrgidgetgrnam(部分实现使用静态缓冲区存储组信息)
4. 线程 / 同步函数

线程相关函数依赖全局锁或线程私有数据,信号处理中调用可能导致死锁。

  • 互斥锁:pthread_mutex_lockpthread_mutex_unlockpthread_mutex_trylock
  • 条件变量:pthread_cond_waitpthread_cond_signalpthread_cond_broadcast
  • 线程管理:pthread_createpthread_joinpthread_cancel
  • 线程私有数据:pthread_getspecificpthread_setspecific
5. 环境变量 / 全局状态函数

这类函数访问或修改全局状态(如环境变量、locale),信号中断可能导致状态不一致。

  • 环境变量:getenvsetenvunsetenvputenv
  • 区域设置:setlocale
  • 进程信息:getuidgetgid(部分实现可能安全,但建议避免)、getpid(通常安全,但 POSIX 未明确)
6. 其他非安全函数
  • 时间函数:localtimegmtime(使用静态缓冲区存储时间结构)
  • 信号相关:signal(非可重入,建议用sigaction替代)
  • 系统调用包装:system(内部创建子进程并调用 shell,依赖全局状态)

为什么这些函数不安全?

非异步安全函数通常存在以下问题:

  1. 使用全局锁:如mallocprintf内部有全局锁,若信号处理函数在主程序持有锁时调用,会导致死锁。
  2. 依赖静态缓冲区:如strtokctime,信号中断可能导致缓冲区数据被覆盖,主程序恢复后读取错误数据。
  3. 修改全局状态:如setenvsetlocale,信号处理中修改全局状态可能导致主程序逻辑混乱。

安全替代方案

信号处理函数中如需完成复杂操作,应仅通过异步安全函数做最小化处理(如设置volatile sig_atomic_t标志),再由主程序轮询标志并执行非安全操作。

常见的异步安全函数包括:write_exitsigprocmaskpthread_sigmaskgetpidgetppid等(完整列表可参考 POSIX 标准man 7 signal-safety)。

总结:信号处理函数中严禁调用上述非异步安全函数,核心原则是 “仅执行最小化、无状态操作”,避免依赖全局资源或锁机制。

举例子

在定时器每秒触发信号的场景下,安全通知线程执行操作的核心是:避免在信号处理函数中直接调用非异步安全接口,而是通过 “信号处理函数→安全通信机制→线程” 的间接方式传递通知。

利用管道(pipe)作为信号和线程之间的安全通信桥梁(write 是异步安全函数),线程通过监听管道数据触发操作。

实现步骤:
  1. 创建管道:用于信号处理函数和工作线程的通信。
  2. 信号处理函数:收到信号后,向管道写 1 字节数据(仅调用 write,异步安全)。
  3. 工作线程:阻塞在管道读端,读取到数据后执行每秒操作。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【K8s】整体认识K8s之K8s的控制器

作用:控制器的作用就是持续监控k8s集群的状态,让它处于我们期望的状态,常见的控制器有replicaset、deployment、daemonset、statefulset 、job 、cronjobReplicaset控制一组pod的副本数,始终与预设的值相同,会持续监视…

R ggplot2学习Nature子刊一张图,换数据即可用!

本次使用R语言复现Nature Communications上的1张组合图,这张图兼具颜值+节约版面! Fig. 1 b原图 ❤️复现效果图-b图❤️ ✅读入测试数据! ✅关键代码, # 关键代码 library(ggplot2) library(dplyr) library(cowplot)# --- 外圈图 --- p_outer <- ggplot(data_aug, aes…

迷你电脑用到什么型号的RJ45网口

迷你电脑常用的 RJ45 网口主要有标准 RJ45 网口和 Mini RJ45 网口两种。标准 RJ45 网口是最常见的类型&#xff0c;遵循 IEEE 802.3i 标准&#xff0c;采用 8P8C&#xff08;8 Position 8 Contact&#xff0c;8 位 8 触点&#xff09;连接器&#xff0c;有 T568A 和 T568B 两种…

网络安全 | 保护智能家居和企业IoT设备的安全策略

网络安全 | 保护智能家居和企业IoT设备的安全策略 一、前言 二、智能家居和企业 IoT 设备面临的安全威胁 2.1 设备自身安全缺陷 2.2 网络通信安全隐患 2.3 数据隐私风险 2.4 恶意软件和攻击手段 三、保护智能家居和企业 IoT 设备的安全策略 3.1 设备安全设计与制造环节的考量 3…

优化器全指南:从原理到调优实战

本文将带你轻松理解深度学习中的“导航系统”——优化器。我们会避开复杂的数学公式,用大量的比喻和图示,让你彻底明白 Adam、AdamW、LAMB 是怎么回事,并学会如何调节它们的关键参数。 第一部分:核心概念:优化器是什么? 一个简单的比喻: 想象你在一座大雾弥漫的山里(…

Notepad++使用技巧1

1.打开官方参考代码经常看到下图这种行尾很多空格的代码&#xff0c;一点都不合符华为的书写规范&#xff0c;阅读起来容易让人烦躁不安。初学者建议看看华为的代码书写规范&#xff0c;你将少走很多弯路&#xff0c;终生受益。2.快速去掉行尾很多空格方法点击顶部菜单栏“宏”…

AIoT云边协同方式

随着物联网&#xff08;IoT&#xff09;与人工智能&#xff08;AI&#xff09;的深度融合&#xff0c;AIoT&#xff08;人工智能物联网&#xff09;作为一种新兴技术范式&#xff0c;正在推动智能设备与产业的快速发展。AIoT通过云边协同的方式&#xff0c;将边缘侧的IoT设备、…

MIT 6.5840 (Spring, 2024) 通关指南——Lab 1: MapReduce

MIT 6.5840 (Spring, 2024) – Lab 1: MapReduce &#x1f468;‍&#x1f4bb; Charles &#x1f517; 实验手册&#xff1a; 6.5840 Lab 1: MapReduce &#x1f4c3; MapReduce 论文原文&#xff1a; mapreduce-osdi04.pdf ✍️ 本系列前文&#xff1a; MIT 6.5840 (Spring, …

吴恩达机器学习作业五:神经网络正向传播

数据集在作业一正向传播正向传播&#xff08;Forward Propagation&#xff09;是神经网络计算过程中的核心步骤&#xff0c;指的是将输入数据通过神经网络的各层依次传递&#xff0c;最终得到输出结果的过程。核心原理在神经网络中&#xff0c;信息从输入层流入&#xff0c;经过…

网络编程(4)

【0】复习 sockfdsocket(); //指定网络信息 bind(); listen(); //创建表 fd_set rfds,tempfds; FD_ZERO(); FD_SET(sockfd); max sockfd while(1) {tempfdsrfds;select(max1,&tempfds)if(FD_ISSET(scokfd,&tempfds)){acceptfdaccept();FD_SET(acceptfd,&rfds);if(m…

Windows系统提示“找不到文件‘javaw‘”

1. Java 未安装或安装不完整javaw.exe 是 Java 运行环境&#xff08;JRE&#xff09;的核心文件&#xff0c;用于运行 Java 程序&#xff08;如.jar 文件&#xff09;。如果你的电脑没有安装 Java&#xff0c;或安装过程中 javaw.exe 被误删&#xff0c;系统就会找不到它。2. J…

【PCIE系列】1---PCIE系统拓扑结构分析

架构由点对点链路&#xff08;Links&#xff09;组成&#xff0c;用于互连组成系统的一系列组件。下图展示了一个示例拓扑结构。该图描述了一个有层次的体系架构实例&#xff0c;其包含根复合体&#xff08;Root Complex, RC&#xff09;、多个端点&#xff08;I/O设备&#xf…

SpringBoot防止重复提交(2)

例如&#xff1a;多次点击提现按钮问题描述&#xff1a;在提现操作中&#xff0c;用户可能会多次点击提现按钮&#xff0c;导致多个相同的请求发送到服务器&#xff0c;从而引发重复提现的问题。为了解决这一问题&#xff0c;必须保证每个提现请求只能执行一次&#xff0c;防止…

mysql zip包安装步骤

下载地址 windows MSI Install 安装包程序。 这里下载zip包&#xff0c;执行安装过程 确认my.ini 配置的路径&#xff0c;创建mysql数据服务的data目录管理员身份cmd 进入bin目录&#xff0c;开始初始化服务 mysqld --initialize-insecure --usermysql mysqld -install#启动…

Python 的 argparse 模块中,add_argument 方法的 nargs 参数

在 Python 的 argparse 模块中&#xff0c;add_argument 方法的 nargs 参数用于指定命令行参数可以接受的参数数量。你提到的 nargs* 和 nargs 是两种常见设置&#xff0c;它们分别表示不同的参数数量要求。以下是两者的详细区别和含义&#xff1a;1. nargs*: 接受零个或多个参…

嵌入式Linux LED驱动开发

嵌入式Linux LED驱动开发 一、LED驱动概述 本笔记基于IMX6ULL处理器的LED驱动开发&#xff0c;详细介绍了字符设备驱动开发的基本流程。该驱动实现了对LED的基本控制功能&#xff0c;通过字符设备接口供用户空间程序调用。 二、LED驱动核心概念 1. 寄存器地址定义 本驱动涉…

Excel Word Pdf 格式转换

引入aspose包手动更新本地mvn仓库mvn install:install-file -DfileC:\aspose-cells-22.9.jar -DgroupIdaspose -DartifactIdaspose-cells -Dversion22.9 -Dpackagingjar mvn install:install-file -DfileC:\aspose-pdf-22.9.jar -DgroupIdaspose -DartifactIdaspose-pdf -Dvers…

变频器实习DAY40 调整测试零伺服PI LDO

目录变频器实习DAY40一、工作内容1.1 调整测试零伺服PI二、学习内容2.1 LDOLDO的核心工作原理——“采样-比较-调整”闭环控制LDO的关键参数——选型核心依据LDO与其他稳压器的选型对比附学习参考网址欢迎大家有问题评论交流 (* ^ ω ^)变频器实习DAY40 一、工作内容 1.1 调整…

【半导体制造流程概述】

半导体制造流程概述 半导体制造是一个高度复杂且精密的过程&#xff0c;涉及多个关键步骤&#xff0c;通常分为以下几个主要阶段&#xff1a;设计、晶圆制备、光刻、刻蚀、掺杂、薄膜沉积、互连和封装测试。 文章目录半导体制造流程概述晶圆制备光刻刻蚀掺杂薄膜沉积互连封装测…

为什么大模型需要文档预处理:从数据到智能的关键一步

在人工智能&#xff0c;尤其是大语言模型&#xff08;LLM, Large Language Models&#xff09;的应用落地过程中&#xff0c;数据质量与处理流程的重要性正逐渐被各行各业所认识。无论是企业内部构建知识库、自动化文档审核&#xff0c;还是面向用户提供智能问答服务&#xff0…