C语言trap 可重入和线程安全

实习点滴 - 跟一个蠢bug学习多线程调试、线程安全和可重入函数 昨天同事帮忙review代码的时候,发现我代码里使用了一个非线程安全的函数localtime,并建议我使用线程安全的localtime_r。于是我查了一下相关资料:time 与 gettimeofday 两个函数得到的都是从Epoch开始(1970-1-1, 00:00:00)到当前的秒数(tt=tv.tv_sec),而后者还能得到更精细的微秒级结果,即tv_sec*(10^6)+tv_usec为从 阅读详情
#include <signal.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>


void handler(int signum)
{
        char result[100];
        time_t now;
//      struct tm time1;


        now = time(NULL);
//      localtime_r(&now, &time1);
//      ctime_r(&now,result);
        strcpy(result,ctime(&now));
//      strftime(result, 100, "%T", &time1);
        printf("At %s, user pressed Ctrl-C\n", result);
}


int main (void)
{
        time_t now;
//      struct tm ltime;
        char result[100];


        if (signal(SIGINT, handler) == SIG_IGN)
                signal(SIGINT, SIG_IGN);


        now = time(NULL);
        while(1) {
#ifdef UNSAFE
        //      localtime_r(&now, <ime);
                ctime(&now);
#endif
        }


        return 0;
}

 对于信号处理函数,尽量做到简单,如果调用了不可重入函数,可能引发死锁问题。

#16 0x0000003257e7230f in _int_free () from /lib64/libc.so.6
#17 0x0000003257e7276b in free () from /lib64/libc.so.6
#18 0x0000003257e8c7ca in tzset_internal () from /lib64/libc.so.6
#19 0x0000003257e8cf2e in __tz_convert () from /lib64/libc.so.6
#20 0x0000003257e8b529 in ctime () from /lib64/libc.so.6
strace -p 1202
Process 1202 attached - interrupt to quit
futex(0x3258154fc0, FUTEX_WAIT_PRIVATE, 5, NULL


gcc -D UNSAFE test1.c -o test_unsafe

gcc -D UNSAFE test1.c -o test

编译上面这个程序可以重现这个问题。


线程中也不要调用非线程安全系统调用,否则也会出现死锁。

关于futex的文章

http://www.cnblogs.com/yysblog/archive/2012/11/03/2752728.html

嵌入式C语言有限状态机工程实现 有限状态机(FSM)是嵌入式系统中建模事件驱动行为的基础技术范式,其核心在于状态、输入与动作三要素的确定性组合。在资源受限的MCU环境下,FSM需满足硬实时响应、静态内存占用可控、多任务/中断安全等关键约束。基于静态跳转表的设计可实现O(1)迁移时间,保障确定性执行;引入事务化机制与条件队列则有效解决RTOS或裸机中断并发下的状态竞态问题。该方案广泛适用于电机控制、电源管理、协议解析等典型嵌入式应用场景,兼顾可维护性与功能安全要求。 阅读详情

相关推荐

深入解析ColdFire V1内核指令时序与中断控制器设计

在嵌入式系统开发中,指令执行时序和中断处理是保障系统实时性与确定性的核心基础。指令时序决定了CPU执行代码的效率,直接影响最坏情况执行时间(WCET)的估算,这是安全关键系统设计的基石。其原理涉及流水线、内存访问模型(包括对齐与非对齐访问)以及总线竞争,理解这些机制对于代码性能优化至关重要。中断控制器则是系统响应外部异步事件的“神经中枢”,它通过硬件优先级管理、向量表和嵌套机制,确保关键任务能得到及时处理。在实时嵌入式领域,如工业控制和汽车电子,精准掌控时序和中断能显著提升系统的可靠性和响应能力。本文聚焦于

weixin_34087307的博客 441

C语言详解 之 函数参数的实现

<br /><br />#include <stdio.h><br />#include <math.h><br />void trap(double a,double b, int n, double f(double arg));<br />double g(double x);<br />double h(double x);<br />int main()<br />{<br /> double a,b;<br /> int n;<br /> printf("区间左端点:");<br /> scan

hui2702的专栏 435

嵌入式Hypervisor调试桩开发实战:回调机制、API与GDB集成

在嵌入式系统开发中,虚拟化技术通过Hypervisor实现硬件资源的强隔离与共享,是构建高可靠性汽车电子、工业控制等系统的核心。其原理在于通过特权级的虚拟机监控器,为多个客户操作系统提供独立的运行环境。这项技术的核心价值在于确保关键任务的确定性与安全性。在应用时,开发者常需深入虚拟机内部进行状态监控与问题诊断,这就引出了底层调试的需求。为此,嵌入式Hypervisor提供了专门的调试桩框架,它基于一套定义良好的回调函数机制,允许开发者在Hypervisor层安全地访问和操纵虚拟机的寄存器、内存及TLB状态。

weixin_34320159的博客 506

trap命令使用详解

<br />它有三种形式分别对应三种不同的信号回应方式.<br />第一种:<br /> trap ""commands"" signal-list<br />当脚本收到signal-list清单内列出的信号时,trap命令执行双引号中的命令.<br />第二种:<br /> trap signal-list <br />trap不指定任何命令,接受信号的默认操作.默认操作是结束进程的运行.<br />第三种:<br /> trap "" "" signal-list<br />trap命令指定一个空命令串

liuchao1986105的专栏 6751

英飞凌TC275 Bootloader实战:内存布局、Flash驱动与启动跳转全解析

在嵌入式系统开发中,Bootloader是固件升级与系统恢复的基石,其设计涉及内存映射、链接脚本、启动流程与外设驱动等多个底层环节。对于基于TriCore架构的英飞凌AURIX系列MCU,如TC275,其多核启动、PMU控制Flash擦写以及安全机制等特性,使得Bootloader开发比传统Cortex-M平台更具挑战性。理解从复位向量到跳转Application的完整流程,掌握TASKING编译器下链接脚本(.lsl)的配置,以及如何将Flash驱动安全地驻留RAM执行,是保障系统稳定性的关键。此类技术在

weixin_33985679的博客 1290

【图形学】Loop细分算法及半边结构实现(C++)

文章目录Loop 细分算法介绍增加新顶点更新旧顶点算法实现半边结构半边结构的表示方法半边结构的构造方法创建所有顶点创建所有面及半边半边结构的使用 Loop 细分 顾名思义,网格细分是将粗糙网格精细化的过程,如下动图。Loop细分是众多网格细分算法的一种,Loop细分仅仅对三角形网格模型有效。值得注意的是,虽然叫Loop细分,但是不能理解为“循环”细分,叫这个名字是因为作者的名字是这个而已。 下面是一个粗糙的兔子模型1000个面,进行3次细分 算法介绍 Loop细分算法主要分两步进行 增加新顶点:增加

wk_119的博客 8066

linux内核之trap.c文件分析

该程序主要定义和实现了asm.s中所引用的各个硬件异常中断处理程序#include #include #include #include #include #include #include 取给定段以及偏移处的一个字节输出寄存器eax,输入寄存器eax,内存地址addr#define get_seg_byte(seg,addr) ({ /register char __res; /__a

缘分天空 3405

Cocos2d-x手游逆向实战:Frida高阶Hook与动态解密技术

Cocos2d-x作为主流跨平台游戏引擎,其混合架构(C++核心+JNI桥接+Lua/JS脚本)和强加固策略(符号剥离、anti-frida、so加壳)使传统逆向方法失效。本文围绕‘无符号定位’‘C++函数硬编码地址识别’‘Lua层AST级劫持’‘OpenGL内存回溯解密’四大关键技术展开,深入解析如何在真实上线项目中稳定hook被strip的libcocos2d.so关键函数、绕过反调试心跳检测、从glTexImage2D参数逆向追踪明文资源,并结合熵值扫描实现零先验知识的内存明文发现。面向已掌握Frid

weixin_30345577的博客 672

论代码级性能优化变迁之路(二)

本文是“论代码级性能优化变迁之路一”(http://www.jianshu.com/p/c4a748002e66) 的第二篇。 在上一篇我们主要介绍了所遇到问题的五点,那么今天接下来讨论剩下的问题,我们先再回顾一下之前讨论的问题: 1、单台40TPS,加到4台服务器能到60TPS,扩展性几乎没有。 2、在实际...

weixin_33736832的博客 183

1 FFmpeg从入门到精通-FFmpeg简介

1.FFmpeg简介 1.1 FFmpeg的定义 1.2 FFmpeg的历史 1.3 FFmpeg的基本组成 1.4 FFmpeg的编解码工具ffmpeg 1.5 FFmpeg的播放器ffplay 1.6 FFmpeg的多媒体分析器ffprobe 1.7 FFmpeg编译(1)FFmpeg之Windows平台编译(2)FFmpeg之Linux平台编译(3)FFmpeg之OS X平台编译 1.8 FFmpeg编码支持与定制(1)FFmpeg的编码器支持(2)FFmpe

migu123的专栏 3687

LTspice进阶技巧-031.一键加密仿真模型:LTspice Encrypt Tool实战指南

本文详细介绍了LTspice Encrypt Tool的使用方法,帮助工程师一键加密LTspice仿真模型,保护知识产权。通过图形化界面简化操作流程,支持批量加密和兼容性处理,适用于电路设计中的模型保护需求。

weixin_28304023的博客 202

LC-3中断机制实战:从轮询到事件驱动的底层实现

中断机制是计算机系统中实现高效事件处理的核心技术,它解决了轮询方式CPU资源浪费的问题。其原理在于硬件主动通知CPU特定事件发生,CPU暂停当前任务,转而执行预设的中断服务程序,处理完毕后再恢复原任务。这一机制的技术价值在于解放了CPU算力,实现了真正的事件驱动架构,为实时系统、外设交互等场景提供了基础支撑。在嵌入式开发与计算机体系结构教学中,中断实验是理解CPU与外部世界交互的关键实践。本文以LC-3教学计算机模拟器为平台,通过编写键盘中断处理程序,深入剖析了中断向量表、内存映射I/O以及中断服务程序的编

weixin_34341117的博客 447

《YOLOv8实例分割实战:训练自己的数据集 》(视频课程)

本课程将手把手地教大家使用labelme标注和使用YOLOv8训练自己的数据集,完成一个多目标实例分割实战项目。

bai666ai的博客 789

malloc_chunk边界标记法和空间复用

ptmalloc分配的空间统一用了malloc_chunk结构来管理,malloc_chunk的结构初看比较奇葩,看了注释,分析了一段时间的代码,发现这种边界标记的设计,在malloc_chunk虚拟地址都是彼此相邻的情况下,是十分高效的。 malloc_chunk结构: struct malloc_chunk { INTERNAL_SIZE_T prev_size; /

simple 4524

Unreal Engine鸿蒙移植实战:环境配置、构建流程与性能优化指南

游戏引擎移植是跨平台开发中的关键技术环节,其核心原理在于通过适配目标操作系统的底层接口和工具链,实现同一套代码在不同硬件和软件环境下的高效运行。这项技术的价值在于最大化代码复用率,降低多平台维护成本,并能让应用快速触达新兴生态系统的用户。在移动游戏和XR应用领域,随着鸿蒙HarmonyOS生态的快速发展,将成熟的商业引擎如Unreal Engine迁移至此平台,成为开发者探索新市场机会的重要路径。本文聚焦于Unreal Engine项目向鸿蒙系统的移植实践,详细解析了从环境搭建、源码适配到构建打包的全链路流

weixin_29011395的博客 404

手把手教你用STM32F103的IO口模拟XY2-100协议驱动数字振镜(附Keil O3优化代码)

本文详细介绍了如何使用STM32F103的IO口模拟XY2-100协议驱动数字振镜,包括协议解析、偶校验算法、寄存器级优化及Keil O3编译下的性能调优。通过硬件配置、核心代码实现和优化技巧,帮助开发者实现高速二维偏转控制,适用于工业激光雕刻和精密定位系统。

weixin_42527401的博客 260

【RISC-V】Trap和Exception

RISC-V之Trap与Exception

佳大先生的博客 5470

[工作流节点10] 获取多条数据并循环执行 —— 明道云批处理自动化实战

本文系统介绍了明道云工作流中"获取多条数据+循环执行"的批处理功能。该功能通过筛选数据集合并逐条处理,适用于批量通知、数据更新等场景。文章详细解析了功能配置方法,包括数据筛选、循环设置和异常处理,并提供了合同到期提醒等典型应用案例。同时强调了数据量控制、分批处理、错误处理等优化策略,帮助用户实现高效批量自动化。这一功能组合能将业务从单条处理升级为批量驱动,显著提升工作效率。

每日出拳老爷子的博客 455

trap 基本介绍

本文对trap做了简单的介绍,对网上搜到的知识点进行搬运,可能存在错误疏漏,后续会不断的补充修正。用途说明trap是一个shell内建命令,它用来在脚本中指定信号如何处理。比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出程序。如果要在Ctrl+C不退出程序,那么就得使用trap命令来指定一下SIGINT的处理方式了。trap命令

nmglwy的博客 9246

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

read函数头文件 window_Windows系统调用中API的3环部分(依据分析重写ReadProcessMemory函数)...

Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.htmlWindows系统调用中API的3环部分一、R3环API分析的重要性Windows所提供给R3环的API,实质就是对操作系统接口的封装,其实现部分都是在R0实现的。很多恶意程序会利用钩子来钩取这些API,从而达到截取内容,修改数据的意图。现在我们使用olldbg对Re...

weixin_39605578的博客 498

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

trap命令

trap命令用于指定在接收到信号后将要采取的动作 所有支持的signal trap -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2...

OfficerGoodbody的博客 2839

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

(莱昂氏unix源代码分析导读-22) trap函数(2693)

莱昂的分析比较清晰。在这里我只说明几个容易让人感到迷惑的问题。   首先是trap函数的长长的参数列表,同clock函数一样,这些参数来自于入口处的设置, 回头看一下栈图,这些参数的容易理解了。   函数开头就检查进程的“前状态”——绝大多数情况下,应该是user态。核态的陷入在 大多数情况下都是一个错误,会引起panic的调用,导致系统down掉。   在“2701: u.u_a

cszhao1980的专栏 3221

32.全网最详细trap讲解,trap语法格式,信号和用途,最常用的信号,trap常用的命令,ctrl + c,信号屏蔽和恢复,trap -,debug,exit,return示例,三个综合案例

6.1 信号捕捉 trap trap ‘触发指令’ 信号 进程收到系统发出的指定信号后,将执行自定义指令,而不会执行原操作 trap ‘’ 信号 忽略信号的操作 trap ‘-’ 信号 恢复原信号的操作 trap -p 列出自定义信号操作 trap finish EXIT 当脚本退出时,执行finish函数 范例: #!/bin/bash trap ‘echo “Press ctrl+c”’ int quit trap -p for((i=0;i<=10;i++)) do sleep 1 echo $

Oracle/MySQL 到 国产信创数据库|迁移 · 调优 · 信创替换 9452

GCC技术参考重点解析

选项前缀 所有选项都以连字符开始。它们中的一些还会用两个连字符。 例如,设定在生成的代码中携带调试信息的传统选项是:

FeelTouch Labs 1644

Linux x86_64 C语言实现gdb断点机制

Linux x86_64 C语言实现gdb断点机制

小立仔 1298

囫囵C语言(二):陷阱,中断和异常

    这三个概念和C语言有什么关系呢?          中断这个词恐怕人民群众都不陌生。很多人把中断分为两种:硬件中断和软件中断。其实怎么叫关系都不大,关键是我们要明白他们之间的异同点。          我比较喜欢把 “中断”,分为三种即陷阱,中断和异常,似乎记得Intel是这么划分的(这句话我不保证正确,有兴趣的人自己看一下 Intel 的手册)。它们的英文分别是 t

青青的专栏--C/C++ OOA/D Design Pattern 884
上一篇: Nginx RTMP 功能研究
下一篇: 利用openssl实现字符串加密解密
csallen
博客等级 码龄17年 36粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值