• 重读APUE(11)-信号安全的可重入函数


    重入时间点

    进程捕捉到信号并对其进行处理时,进程正在执行的正常指令序列就会被信号处理程序临时中断,它首先执行该信号粗合理程序中的指令;如果从信号处理程序返回,则继续执行捕捉到信号时进程正在执行的正常指令序列;

    ps:如果了解驱动,上面这段信号打断流程与中断打断进程上下文很类似;

    不可重入函数

    对于有些函数,是不可重入的,如果信号处理程序打断了这些函数的执行,同时信号粗合理程序中也调用这个函数,就会发生错误;这些不可重入的函数,有如下特点:

    1. 使用了静态的数据结构;

    2. 调用了malloc或者free;

    3. 是标准的I/O函数;标准IO库的很多实现都以不可重入方式使用全局数据结构;

    我们自己写程序时,应该尽量的注意将函数实现为可重入,如果不可重入,则需要进行锁保护;

    信号安全的函数

    下面的列表为异步信号安全的函数,除了可重入以外,在信号处理操作期间,它会阻塞任何引起不一致信号的发送;也就是说信号处理程序可以安全的调用这些函数;

    errno

    即使使用了信号安全的函数,但是由于每个线程只有一个errno,所以信号处理程序可能会修改它原来的值;作为一个通用规则,在信号处理程序中调用上图中的函数时,应当在调用前堡村errno,在调用后恢复errno;(经常被捕获到的信号是SIGCHLD,其信号处理程序通常要调用一种wait函数,而各种wait函数多能改变errno)

    区分信号安全和线程安全的可重入

    信号安全的可重入函数与线程安全的可重入函数不是一回事,注意区分;

  • 相关阅读:
    用Apache Kafka构建流数据平台
    kafka与传统的消息中间件对比
    Azkaban简介和使用
    kettle初探
    less命令
    spring扩展点之二:spring中关于bean初始化、销毁等使用汇总,ApplicationContextAware将ApplicationContext注入
    Spring 注释标签@Resource @Autowired 和@Inject的区别
    【MyEclipse 2015】 逆向破解实录系列【2】(纯研究)
    HDOJ 5073 Galaxy 数学 贪心
    windows 8.0上eclipse 4.4.0 配置centos 6.5 上的hadoop2.2.0开发环境
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/11764235.html
Copyright © 2020-2023  润新知