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

Jic*_*hao 7 sockets glibc

看了一下GNU C Library的源代码,我发现inet_ntoa是用.实现的

static __thread char buffer[18]
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

asv*_*kau 17

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

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

确实,这不是可重复的,也不符合该术语的精神.如果你有一个调用它的递归函数,你不能依赖于调用之间的缓冲区.但它可以被多个线程使用,这通常足够好.

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