为什么inet_ntoa被设计成一个不可重入的函数?

时间:2009-11-10 05:55:16

标签: sockets glibc

浏览GNU C Library的源代码,我发现inet_ntoa是用

实现的
static __thread char buffer[18]

我的问题是,由于需要使用reeentrant inet_ntoa,为什么GNU C Library的作者不使用malloc来实现它?

感谢。

1 个答案:

答案 0 :(得分:17)

它不使用堆的原因是符合标准(POSIX)和其他系统。接口不是这样你应该释放返回的缓冲区。它假设静态存储..

但是通过将其声明为本地线程(使用__thread),如果两个线程碰巧都在调用该函数,则它们不会相互冲突。这是glibc对于界面破碎的解决方法。

确实,这不是 re-entrant 或与该术语的精神一致。如果你有一个调用它的递归函数,你不能依赖于调用之间的缓冲区。但它可以被多个线程使用,这通常是足够好的。

编辑:顺便说一下,我记得,这个函数的新版本使用了调用者提供的缓冲区。请参阅inet_ntop()