You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:06:02