Signal处理中的函数可重入问题
2019独角兽企业重金招聘Python工程师标准>>>
1. Signal信号简介
信号是软件层次上模拟的中断,它是一种异步通信的处理机制。信号的异步性意味着,应用程序不用等待事件的发生,当信号发生时应用程序自动陷入到对应的信号处理函数中。产生信号的事件对进程而言是随机出现的。信号的响应方式有忽略、捕捉、执行默认动作三种。
2. 线程安全
线程安全函数:在C语言中局部变量是在栈中分配的,任何未使用静态数据或其他共享资源的函数都是线程安全的。使用全局变量的函数是非线程安全的。使用静态数据或其他共享资源的函数,必须通过加锁的方式来使函数实现线程安全。
线程安全的(Thread-Safe):如果一个函数在同一时刻可以被多个线程安全地调用,就称该函数是线程安全的。线程安全函数解决多个线程调用函数时访问共享资源的冲突问题。
3. 可重入
可重入(Reentrant)函数可以由多于一个线程并发使用,而不必担心数据错误。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入性解决函数运行结果的确定性和可重复性。
1) 一个函数对于多个线程是可重入的,则这个函数是线程安全的;
2) 一个函数是线程安全的,但并不一定是可重入的,比如使用互斥锁实现的线程安全;
3) 可重入性要强于线程安全性。
4. Signal信号处理
信号处理函数中只能调用可重入函数,而不能调用不可重入函数。进程捕捉到信号并对其进行处理时,正在执行的正常指令序列就被信号处理程序临时中断,它首先执行该信号处理函数中的指令。如果从信号处理程序返回,则继续执行在捕捉到信号时正在执行的正常指令序列(这类似于发生硬件中断时所做的)。但在信号处理函数中,不能判断捕捉到信号时线程执行到何处。
信号处理函数默认情况下是在进程的主线程调用的,这种情况下使用不可重入函数,有可能会造成不可预知的错误。比如调用了malloc函数,为了保证malloc是线程安全的,所以内部使用了锁,根据malloc中锁的不同处理方式,分别可能会导致以下情况的发生:
1) 如果是普通锁,在主线程中malloc函数获取锁之后被signal中断,在signal处理函数中继续调用malloc,因为主线程中的malloc已经获取到了锁,signal处理函数只能等待锁释放,而主线程中的malloc函数正在等待signal处理函数返回后继续执行,这样就造成了锁死;
2) 如果是递归锁,那么signal处理函数中的malloc函数获取锁后进行内存分配,因为上次的malloc操作还没完,可能成会造成内存数据混乱。
就定时而言,可不直接使用singal alarm,而使用posix定时器,通过通知线程的方式,将定时处理函数放到单独的线程中来处理。
转载于:https://my.oschina.net/u/3770369/blog/1858008
Signal处理中的函数可重入问题相关推荐
- C语言printf重入,单片机中printf函数的重映射
单片机中printf函数的重映射 一.源自于:大侠有话说 1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能 除了打印你想要的字符到屏幕上外,还能把数字进行格式化 ...
- 浅谈函数的重入与不可重入
在学习Linux信号以后,我看到这样的一个代码. #include<stdio.h> #include<signal.h> #include<unistd.h>in ...
- 函数可重入性及编写规范
一.可重入函数 1)什么是可重入性? 可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误.相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能 ...
- 函数可重入问题reentrant functions
最近经常听到这个名词,以前也听到过,不过接触更多的是"线程安全问题",而且本人也一直理解的是两个名字的含义是一样的.今天仔细总结一下这个名词相关的概念. 引用博文:可重入函数和不可 ...
- 函数可重入与不可重入理解
static:修饰全局变量,函数 改变作用域 修饰 局部变量 生命周期随进程 volatile: 作用:修饰一个变量,保持变量的内存可见性 修饰变量后,cpu每次访问变量数据,都需要从内存中 ...
- 函数可重入性(Reentrancy)概念详解
1.什么是可重入性 重入一般可以理解为一个函数在同时多次调用,例如操作系统在进程调度过程中,或者单片机.处理器等的中断的时候会发生重入的现象. 可重入的函数必须满足以下三个条件: (1)可以在执行的过 ...
- 2信号处理之:信号产生原因,进程处理信号行为,信号集处理函数,PCB的信号集,sigprocmask()和sigpending(),信号捕捉设定,sigaction,C标准库信号处理函数,可重入函数,
1信号产生原因 2.进程处理信号行为 manpage里信号3中处理方式: SIG_IGN SIG_DFL 默 ...
- 什么是可重入函数, 不可重入函数? 哪些原因导致函数不可重入?
定义: 在实时系统的设计中,经常会出现多个任务调用同一个函数的情况.如果有一个函数不幸被设计成为这样:那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果.这样的函数是 ...
- 递归转化成非递归过程_8086微处理器中的递归和重入过程
递归转化成非递归过程 As we all know that a procedure is a set of instruction written separately which can be u ...
最新文章
- 面试官问:高并发下,你都怎么选择最优的线程数?
- PyTorch or TensorFlow?强力推荐PyTorch不是没有理由的!一文学透pytorch!
- Session 时间
- Lync Server 2010的部署系列(三) lync批量导入用户联系人
- 数据结构第八篇——链栈
- 谈谈 SAP 产品 UI 开发中的组件概念
- virtualbox php mac,mac一体机通过Oracle VM VirtualBox装win8.1系统
- python知识点智能问答_基于知识图谱的智能问答机器人
- P1303 A*B Problem(python3实现)
- Spring boot (1)--- 第一个应用程序helloworld
- MapGuide应用开发系列(八)----MapGuide Studio准备地图之地图(Map)
- git 拉取远程的dev分支到本地的dev分支,再跟本地的my分支合并
- matlab 三边测量,三边测量的定位算法,matlab转为c
- Cobalt Strike远控木马分析
- 【STM32】HAL库——ADC
- 【C语言】C语言的三种基本控制结构-顺序、选择、循环
- 【k哥爬虫普法】程序员183并发爬取官方网站,直接获刑3年?
- mysql截取字符串后缀_Mysql字符串截取函数SUBSTRING的用法说明
- 微信小程序体验版,手机打开调试正常访问 关闭调试访问不通
- html页面标题是什么,javascript如何获取网页的标题(title)?