32位Ubuntu下syscall(SYS_getuid)返回-1与getuid结果不一致问题
问题原因
你遇到报错的核心是32位x86架构下传统的SYS_getuid系统调用已经被废弃。你的Docker宿主是64位Windows,运行32位Linux容器时,内核默认没有提供对旧16位UID系统调用的兼容支持,因此直接调用SYS_getuid会返回ENOSYS(功能未实现)错误。
而glibc封装的getuid()函数内部做了架构兼容,会自动调用支持32位UID的新系统调用SYS_getuid32,因此可以正常返回结果。
解决方法
将代码中的SYS_getuid替换为SYS_getuid32即可正常获取UID,修改后的代码示例如下:
#include <unistd.h> #include <sys/syscall.h> #include <stdio.h> #include <errno.h> #include <string.h> int main(int argc, char *argv[]) { uid_t uid = syscall(SYS_getuid32); if(uid == (uid_t)-1) printf("Error: %s\n", strerror(errno)); printf("%d\n", uid); return 0; }
补充说明
- x86 32位Linux中,
SYS_getuid对应的老式16位UID系统调用仅支持最大65535的UID,早已被支持32位UID的SYS_getuid32替代 - glibc的
getuid()封装屏蔽了底层系统调用的差异,会自动选择当前内核支持的有效调用,直接调用库函数不会遇到这类兼容性问题 - 如果是为了学习系统调用用法,在32位x86环境下涉及uid/gid相关的系统调用,都需要选择带
32后缀的版本,比如SYS_getgid32、SYS_geteuid32等
内容的提问来源于stack exchange,提问作者Iter Ator
相关产品推荐
相关产品推荐

