2009-11-10 35 views
7

在GNU C库的源代码扫视了一眼,我发现INET_NTOA是implementated与为什么inet_ntoa被设计成非重入函数?

static __thread char buffer[18] 

我的问题是,由于需要使用reeentrant INET_NTOA,为什么不GNU C库使用的作者malloc来执行它?

谢谢。

回答

17

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

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

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

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

+0

@asveikau:对不起,打印错误。 – Jichao 2009-11-10 06:03:20

+0

@asveikau:总之,它的兼容性? – Jichao 2009-11-10 06:04:22

+0

@jcyang是的,它是为了兼容性。 – asveikau 2009-11-10 06:06:22