NETBSD 3.1 错误 - 在 malloc() 中:警告:递归调用
NETBSD 3.1 error - in malloc(): warning: recursive call
测试场景是 ping 来 IP 和 ctr+C 从脚本中交替调用。
似乎在调用信号处理程序时,ping 是在 malloc 中。信号处理程序还调用了 malloc,并且 malloc 返回了以下警告。
在 malloc() 中:警告:递归调用
但我仍然找不到它是如何导致崩溃的,有人可以解释一下吗
啊,使用不可重入函数的可怕信号处理程序问题。
问题在于 *BSD ping
的功能添加维护人员从一开始就致力于安全地做事。
FreeBSD 在 1994 年添加了这个问题,并在 1996 年注意到了它,并开始采取本应比实际更短的方法来解决这个问题,并在 1998 年的某个时候进行了最终修复。
OpenBSD 在 1997 年添加了这个问题,在 2002 年注意到了它,但完全忽略了问题的本质,直到 2015 年才正确彻底地修复它。
NetBSD 在 1996 年添加了这个问题,但是正如您所发现的,它还没有被修复。 NetBSD 可能应该导入 OpenBSD ping。
问题是 malloc()
和任何 STDIO(包括 printf()
)都不是可重入的,这是信号处理程序中使用的所有代码的必要条件。
有许多更好的地方可以找到重入、信号处理程序问题等的描述,但也许这个问题及其接受的答案(以及一些相关问题)将是一个好的开始:
Why are malloc() and printf() said as non-reentrant?
测试场景是 ping 来 IP 和 ctr+C 从脚本中交替调用。
似乎在调用信号处理程序时,ping 是在 malloc 中。信号处理程序还调用了 malloc,并且 malloc 返回了以下警告。 在 malloc() 中:警告:递归调用
但我仍然找不到它是如何导致崩溃的,有人可以解释一下吗
啊,使用不可重入函数的可怕信号处理程序问题。
问题在于 *BSD ping
的功能添加维护人员从一开始就致力于安全地做事。
FreeBSD 在 1994 年添加了这个问题,并在 1996 年注意到了它,并开始采取本应比实际更短的方法来解决这个问题,并在 1998 年的某个时候进行了最终修复。
OpenBSD 在 1997 年添加了这个问题,在 2002 年注意到了它,但完全忽略了问题的本质,直到 2015 年才正确彻底地修复它。
NetBSD 在 1996 年添加了这个问题,但是正如您所发现的,它还没有被修复。 NetBSD 可能应该导入 OpenBSD ping。
问题是 malloc()
和任何 STDIO(包括 printf()
)都不是可重入的,这是信号处理程序中使用的所有代码的必要条件。
有许多更好的地方可以找到重入、信号处理程序问题等的描述,但也许这个问题及其接受的答案(以及一些相关问题)将是一个好的开始:
Why are malloc() and printf() said as non-reentrant?