0

测试场景是 ping 来 IP 和 ctr+C 交替从脚本调用。

似乎在调用信号处理程序时,ping 在 malloc 内。信号处理程序也称为 malloc 并且 malloc 返回以下警告。在 malloc() 中:警告:递归调用

但是我仍然找不到它是如何导致崩溃的,有人可以解释一下吗

4

1 回答 1

1

啊,使用不可重入函数的可怕信号处理程序问题。

问题是 *BSDping的特性添加维护者从一开始就致力于安全地做事。

FreeBSD 在 1994 年添加了这个问题,并在 1996 年注意到了它,并开始了一条比实际更短的路径来解决这个问题,最终修复是在 1998 年的某个时候。

OpenBSD 在 1997 年添加了这个问题,在 2002 年注意到了它,但完全忽略了问题的本质,直到 2015 年才正确和完全地修复它。

NetBSD 在 1996 年添加了这个问题,但正如您所发现的,它还没有被修复。NetBSD 应该可能会导入 OpenBSD ping。

问题既不malloc()是 STDIO(包括printf())也不是可重入的,这是信号处理程序中使用的所有代码的必要性。

有很多更好的地方可以找到关于重入、信号处理程序问题等的描述,但也许这个问题及其接受的答案(以及一些相关问题)将是一个好的开始:

为什么说 malloc() 和 printf() 是不可重入的?

于 2016-06-30T19:09:52.150 回答