7
在GNU C库的源代码扫视了一眼,我发现INET_NTOA是implementated与为什么inet_ntoa被设计成非重入函数?
static __thread char buffer[18]
我的问题是,由于需要使用reeentrant INET_NTOA,为什么不GNU C库使用的作者malloc来执行它?
谢谢。
在GNU C库的源代码扫视了一眼,我发现INET_NTOA是implementated与为什么inet_ntoa被设计成非重入函数?
static __thread char buffer[18]
我的问题是,由于需要使用reeentrant INET_NTOA,为什么不GNU C库使用的作者malloc来执行它?
谢谢。
它不使用堆的原因是符合标准(POSIX)和其他系统。该接口只是不是你应该释放返回的缓冲区。它假定静态存储..
但是,通过声明它为线程本地(使用__thread
),两个线程不会相互冲突,如果它们碰巧都在调用该函数。这是glibc解决界面破坏的解决方法。
确实,这不是重入或符合该术语的精神。如果你有一个调用它的递归函数,你不能依赖调用之间的缓冲区。但它可以被多个线程使用,这通常足够好。
编辑:顺便说一下,我只记得,这个函数有一个更新的版本,它使用了调用者提供的缓冲区。请参阅inet_ntop()
。
@asveikau:对不起,打印错误。 – Jichao 2009-11-10 06:03:20
@asveikau:总之,它的兼容性? – Jichao 2009-11-10 06:04:22
@jcyang是的,它是为了兼容性。 – asveikau 2009-11-10 06:06:22