测试场景是 ping 来 IP 和 ctr+C 交替从脚本调用。
似乎在调用信号处理程序时,ping 在 malloc 内。信号处理程序也称为 malloc 并且 malloc 返回以下警告。在 malloc() 中:警告:递归调用
但是我仍然找不到它是如何导致崩溃的,有人可以解释一下吗
测试场景是 ping 来 IP 和 ctr+C 交替从脚本调用。
似乎在调用信号处理程序时,ping 在 malloc 内。信号处理程序也称为 malloc 并且 malloc 返回以下警告。在 malloc() 中:警告:递归调用
但是我仍然找不到它是如何导致崩溃的,有人可以解释一下吗
啊,使用不可重入函数的可怕信号处理程序问题。
问题是 *BSDping
的特性添加维护者从一开始就致力于安全地做事。
FreeBSD 在 1994 年添加了这个问题,并在 1996 年注意到了它,并开始了一条比实际更短的路径来解决这个问题,最终修复是在 1998 年的某个时候。
OpenBSD 在 1997 年添加了这个问题,在 2002 年注意到了它,但完全忽略了问题的本质,直到 2015 年才正确和完全地修复它。
NetBSD 在 1996 年添加了这个问题,但正如您所发现的,它还没有被修复。NetBSD 应该可能会导入 OpenBSD ping。
问题既不malloc()
是 STDIO(包括printf()
)也不是可重入的,这是信号处理程序中使用的所有代码的必要性。
有很多更好的地方可以找到关于重入、信号处理程序问题等的描述,但也许这个问题及其接受的答案(以及一些相关问题)将是一个好的开始: