signal处理中的函数可重入问题

  1. 概念:信号是软件层次上模拟的中断,它是一种异步通信的处理机制。信号的异步性意味着,应用程序不用等待事件的发生,当信号发生时应用程序自动陷入到对应的信号处理函数中。产生信号的时间对进程来说是随机出现的。
  2. 信号的响应方式有忽略,捕捉,执行默认动作三种
  3. 可重入函数可以由多于一个线程并发使用,而不必担心数据错误。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入性解决函数运行结果的确定性和可重复性。
  4. 信号函数默认情况下是在进程的主线程调用的,这种情况下使用不可重入函数,有可能会造成不可预知的错误。
    比如调用了malloc函数,为了保证malloc是线程安全的,所以内部使用了锁,根据malloc中锁的不同处理方式,分别可能会导致以下情况的发生:
    1)如果是普通锁,在主线程中malloc函数获取锁之后被signal中断,在signal处理函数中继续调用malloc,因为主线程中的malloc已经获取到了锁,signal处理函数只能等待锁释放,而主线程中的malloc函数正在等待signal处理函数返回后继续执行,这样就造成了锁死;
    2)如果是递归锁,那么signal处理函数中的malloc函数获取锁后进行内存分配,因为上次的malloc操作还没完,可能成会造成内存数据混乱。
  5. 就定时而言,可不直接使用singal alarm,而使用posix定时器,通过通知线程的方式,将定时处理函数放到单独的线程中来处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值