Linux C之可重入函数

在这里对Linux C编程中的可重入函数进行部分说明。该笔记是为了以后自己使用的时候查看的,可能会有一些错误。如能指出错误之处,则十分感谢!

可重入函数就是可以在运行期间再次被调用的函数,由于Linux是一个多任务操作系统,在任务执行期间捕捉到信号并对其进行处理时,进程正在执行的指令序列就被信号处理程序临时中断。如果从信号处理程序返回,则继续执行进程断点处的正常指令序列,重新恢复到断点重新执行的过程中,函数所依赖的环境没有发生改变,也就是说这个函数是可重入的,反之就是不可重入的

在进程中断期间,系统会保存和恢复进程的上下文,然而恢复的上下文仅限于返回地址、处理器、寄存器等之类的少量上下文,而函数内部使用的诸如全局或静态变量、buffer等并不在保护之列,所以如果这些值在函数被中断期间发生了改变,那么当函数回到断点继续执行时,其结果就不可预料了。例如一个进程正在执行malloc 分配堆空间,此时程序捕捉到信号发生中断,在执行信号的处理程序中恰好也有一个malloc,这样就会对进程的环境造成破环。因为malloc 通常为它所分配的存储区维护一个链接表,插入执行信号处理函数时,进程可能正在对这张表进行操作,而信号处理函数的调用刚好覆盖了进程的操作,造成错误。

通常来说,满足下面条件之一的大多数是不可重入函数:

  • 使用了静态数据结构。
  • 调用了malloc 函数或free 函数。
  • 调用了标志I/O函数࿱
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值