【问题标题】:Why inet_ntoa is designed to be a non-reentrant function?为什么 inet_ntoa 被设计为不可重入函数?
【发布时间】:2010-12-14 22:07:01
【问题描述】:

看了一下GNU C库的源码,发现inet_ntoa是用

实现的
static __thread char buffer[18]

我的问题是,既然需要使用可重入的inet_ntoa,为什么GNU C库的作者不使用malloc来实现呢?

谢谢。

【问题讨论】:

    标签: sockets glibc


    【解决方案1】:

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

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

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

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

    【讨论】:

    • @asveikau:总之,是为了兼容性?
    • @jcyang 是的,这是为了兼容性。
    猜你喜欢
    • 2021-05-29
    • 2016-04-22
    • 2019-10-23
    • 2021-05-23
    • 2018-10-10
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多