Sockets 为什么inet_ntoa被设计为不可重入函数?

Sockets 为什么inet_ntoa被设计为不可重入函数?,sockets,glibc,Sockets,Glibc,浏览GNU C库的源代码,我发现inet_ntoa是用 static __thread char buffer[18] 我的问题是,既然需要使用Reentrant inet_ntoa,为什么GNU C库的作者不使用malloc来实现它呢 谢谢。它不使用堆的原因是为了符合标准(POSIX)和其他系统。接口并不是要释放返回的缓冲区。它假定静态存储 但是,通过将其声明为线程本地(使用\uuu-thread),如果两个线程碰巧都在调用函数,则它们不会相互冲突。这是glibc解决接口中断的方法 这是真的

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

static __thread char buffer[18]
我的问题是,既然需要使用Reentrant inet_ntoa,为什么GNU C库的作者不使用malloc来实现它呢


谢谢。

它不使用堆的原因是为了符合标准(POSIX)和其他系统。接口并不是要释放返回的缓冲区。它假定静态存储

但是,通过将其声明为线程本地(使用
\uuu-thread
),如果两个线程碰巧都在调用函数,则它们不会相互冲突。这是glibc解决接口中断的方法

这是真的,这不是重新进入或符合该术语的精神。如果您有一个调用它的递归函数,则不能依赖于调用之间的缓冲区是相同的。但是它可以被多个线程使用,这通常已经足够好了


编辑:顺便说一下,我刚刚记得,这个函数有一个更新版本,它使用了调用方提供的缓冲区。请参阅。

@asveikau:总之,这是为了兼容性?@jcyang是的,这是为了兼容性。