为什么malloc不是异步信号安全?

Kar*_*lek 19 unix

为什么malloc不能用于信号处理程序?什么可能"发生错误"?

JSB*_*ոգչ 25

可以随时调用信号处理程序,包括在另一个调用malloc正在进行的时间.如果发生这种情况,将发生以下两种情况之一:

  1. 您的进程将在信号处理程序内死锁,因为malloc将无法获取堆锁.
  2. 你的进程会破坏它的堆,因为malloc 它确实获得了锁(或者认为它不需要它),然后继续渲染堆不一致,导致后来的崩溃.

  • 这是旧的,但值得回答:当信号到达时,它会在过程中的一个线程内处理.我能想到的最简单的情况涉及一个线程在调用malloc时捕获一个信号(比如,在它获取锁之后).然后,信号处理程序调用malloc.当它试图获取锁时,它会看到锁已被保持,因此它等待锁.最终释放锁的线程部分将永远不会运行,因为它正在等待信号处理程序完成.信号处理程序永远不会完成,因为它正在等待锁定 (9认同)