我想使用系统调用来获取当前用户的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
。我错在哪里了?如何使用syscall
获取当前用户ID?
我在 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
main.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
docker run -ti --rm i686/ubuntu
然后apt-get update && apt-get install gcc && printf'%s\n' '#include <unistd.h>' '#include <sys/syscall.h>' '#include <stdio.h>' 'main() { printf("%d\n", syscall(SYS_getuid)); }' | gcc -m32 -xc - && ./a.out
可以正常工作并返回0
。请创建一个完整的[MCVE]。 - KamilCukgetuid()
函数返回一个uid_t
,它不一定是一个int
。您认为使用syscall(SYS_getuid)
解决了什么问题? - Andrew HenleSYS_getuid
常量的值吗?如果这是一个32位的Linux程序,它应该等于24,如https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md#x86-32_bit所示。如果它是102,则意味着你不知何故包括了64位头文件。 - Nate Eldredge