glibc中__gethostbyname_r函数的实现位置与功能问询
问题解答
__gethostbyname_r() 实现所在的glibc源码文件
__gethostbyname_r 并不是直接在某个手写的.c文件中定义的,它是glibc通过模板文件编译生成的函数,对应的模板源码路径为nss/getXXbyYY_r.c。
glibc的名称服务切换(NSS)模块中,所有gethostbyXXX、getnetbyXXX类的可重入函数都是通过同一个模板生成的:编译时会传入不同的宏参数(比如你提到的FUNCTION_NAME、REENTRANT_NAME等),预处理器会自动把模板中的占位符替换成对应函数的逻辑,生成包含__gethostbyname_r实现的目标文件。
__gethostbyname_r() 的具体功能
这是glibc内部使用的、可重入版本的主机名查询函数,核心功能是根据传入的主机名,查询对应的主机信息(包括IPv4/IPv6地址、主机别名、地址类型等),返回结果为hostent结构体类型。
和标准的非可重入gethostbyname相比,它有两个核心差异:
- 不需要依赖全局静态缓冲区存储返回结果,要求调用方提前分配好缓冲区(对应你看到的
buffer、buffer_size参数),查询结果会直接写入用户提供的缓冲区中,多线程场景下调用不会出现结果互相覆盖的问题,线程安全。 - 错误码不会写入全局的
h_errno变量,而是写入调用方传入的h_errno指针指向的地址,避免多线程下错误码被篡改。
另外注意__开头的命名说明它是glibc的内部符号,不会对外暴露,普通应用程序应该调用POSIX标准定义的gethostbyname_r接口,而不是直接调用这个内部实现。
内容的提问来源于stack exchange,提问作者Light
相关产品推荐
相关产品推荐

