代码之家  ›  专栏  ›  技术社区  ›  Iter Ator

syscall(SYS_getuid)从getuid()返回不同的结果

  •  0
  • Iter Ator  · 技术社区  · 2 年前

    我想使用系统调用来获取当前用户的id。我这样试过:

    #include <unistd.h>
    #include <sys/syscall.h>
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        int uid = syscall(SYS_getuid);
        
        printf("%d\n", uid);
        
        return 0;
    }
    
    

    我用root执行了它,但它打印出来了 -1 而不是 0 .

    如果我将其替换为 int uid = syscall(SYS_getuid); ,则它正确地返回 0 。我做错了什么?如何使用获取当前用户id syscall ?

    我在上面运行 i686/ubuntu docker镜像,因为我必须创建32位可执行文件。


    可重复性最小的示例:

    Dockerfile

    FROM i686/ubuntu
    
    RUN apt-get update
    RUN apt-get install --assume-yes --no-install-recommends --quiet \
            gcc libc6-dev
    RUN apt-get clean all
    

    主要的c

    #include <unistd.h>
    #include <sys/syscall.h>
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
        
        int uid = syscall(SYS_getuid);//getuid();//
        
        if(uid == -1)
            printf("Error: %s\n", strerror(errno));
        
        printf("%d\n", uid);
        
        return 0;
    }
    

    运行(在x64 Windows10上):

    docker build --platform linux/386 -t my-gcc .
    docker run --platform linux/386 --rm -v ${pwd}:/usr/local/src/:rw my-gcc gcc -m32 -xc /usr/local/src/main.c -o /usr/local/src/main
    docker run --platform linux/386 --rm -v ${pwd}:/usr/local/src/:rw my-gcc /usr/local/src/main
    

    结果是:

    Error: Function not implemented
    -1
    
    0 回复  |  直到 2 年前
        1
  •  5
  •   user3840170    2 年前

    getuid(2) :

    最初的Linux getuid()和geteuid()系统调用仅支持16位用户ID。随后,Linux 2.4添加了getuid32()和geteuid32(),支持32位ID。glibc getuid()和geteuid()包装器函数透明地处理内核版本之间的变化。

    显然,您正在一个内核上运行程序,该内核具有旧的 getuid 系统调用已编译完毕,并且仅 getuid32 在x86-32上提供。如果你跑步 fgrep CONFIG_UID16 "/boot/config-$(uname -r)" ,您将能够看到您正在运行的内核是否支持16位系统调用。如果此命令打印除 CONFIG_UID16=y ,表示旧的系统调用不可用。

    如果您调用 SYS_getuid32 相反,它应该可以正常工作。请注意 系统设置32 可能无法在其他架构上使用。