代码之家  ›  专栏  ›  技术社区  ›  Jichao

为什么inet-ntoa被设计成不可重入函数?

  •  7
  • Jichao  · 技术社区  · 15 年前

    我浏览了一下GNUClibrary的源代码,发现inet-ntoa是用

    static __thread char buffer[18]
    

    我的问题是,既然有必要使用Reentrant inet ountoa,为什么GNU C库的作者不使用malloc来实现它呢?

    谢谢。

    1 回复  |  直到 15 年前
        1
  •  17
  •   asveikau    15 年前

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

    但是通过将其声明为线程本地(使用 __thread ,如果两个线程同时调用函数,则它们不会发生冲突。这是glibc为界面的破碎所做的工作。

    这不是真的 可重入的 或者符合这个术语的精神。如果有一个递归函数调用它,那么在两次调用之间,缓冲区不能是相同的。但是它可以被多个线程使用,这通常已经足够好了。

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

    推荐文章