Linux无glibc封装系统调用:应使用__NR_gettid还是SYS_gettid宏?
关于Linux系统调用宏__NR_gettid与SYS_gettid的疑问解答
背景说明
部分Linux系统调用(如gettid)没有glibc封装,因此必须通过syscall()函数调用。在/usr/include/x86_64-linux-gnu/bits/syscall.h文件中可见如下定义:
#ifdef __NR_gettid
define SYS_gettid __NR_gettid#endif
为何存在两个别名?
__NR_*系列是Linux内核原生定义的系统调用编号,属于内核层面的命名规范。不同CPU架构(如x86_64、ARM)的同功能系统调用,对应的__NR_*数值可能不同,内核头文件会根据当前架构适配定义。SYS_*系列是glibc为用户态调用syscall()函数封装的别名。glibc将内核的__NR_*映射为SYS_*,目的是给用户态代码提供一套更贴合用户态编程习惯的统一调用接口。
可移植性与稳定性对比
- 稳定性:
__NR_*由内核直接定义,只要内核支持该系统调用,这个宏就会存在,但跨架构时数值可能不一致;SYS_*由glibc维护,会保证在同一架构下与内核的__NR_*值完全一致,依赖glibc的版本兼容性。 - 可移植性:如果代码需要跨Linux架构运行,两者都需要配合架构判断逻辑,但
SYS_*更符合用户态代码的glibc使用惯例;内核态代码只会使用__NR_*,而用户态通过syscall()调用时,SYS_*是更适配的选择。
核心结论:代码中应使用哪个宏?
优先选择SYS_gettid:
SYS_*是glibc专门为用户态syscall()调用设计的接口,更贴合用户态编程的生态习惯。- 虽然两者本质上指向同一个系统调用号,但
SYS_*会随glibc的适配调整同步更新,能降低代码的后续维护成本。
内容的提问来源于stack exchange,提问作者Daniel Walker
相关产品推荐
相关产品推荐

