1.Reentrant Function:可重入函数
当捕捉到信号时,不论进程的主控制流程当前执行到哪儿,都会先跳到信号处理函数中执行,从信号处理函数
返回后再继续执行主控制流程。信号处理函数是一个单独的控制流程,因为它和主控制流程是异步的,二者不存在调用和被调用的关系,并且使用不同的堆栈空间。
使用小结:
- 不使用全局变量:上图使用了全局变量head导致出错
- 不调用non-reentrant函数:malloc、标准IO函数
2.Thread-Safe:线程安全
使用小结:
- 使用锁保障线程安全
3.Async-Signal-Safe Function:异步信号安全函数
使用小结:
- signal_handle里面只有几个固定的函数是 signal-safe的(malloc、sprintf等都不是信号安全函数)
- signal_handler里面使用锁很容易死锁:程序的某个线程获得了锁,然后然后还没释放,这时又被信号中断了,然后在signal handler函数里面又尝试去获取锁的话,就会重新获取锁,就死锁了。
参考:
http://idning.github.io/twemproxy-deadlock-on-signal_handler.html
http://wangcong.org/blog/archives/506
http://gmd20.blog.163.com/blog/static/168439232014516113322378/
时间: 2024-10-23 16:15:25