syscall(SYS_getuid) returns 来自 getuid() 的不同结果
syscall(SYS_getuid) returns different result from getuid()
我想使用系统调用来获取当前用户的 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);
替换它,那么它就正确 returns 0
。我做错了什么?如何使用 syscall
?
获取当前用户 ID
我 运行 它在 i686/ubuntu
docker 图像上,因为我必须创建 32 位可执行文件。
最小可重现示例:
Docker 文件
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
根据 getuid(2):
The original Linux getuid() and geteuid() system calls supported only 16-bit user IDs. Subsequently, Linux 2.4 added getuid32() and geteuid32(), supporting 32-bit IDs. The glibc getuid() and geteuid() wrapper functions transparently deal with the variations across kernel versions.
显然,您正在 运行 将您的程序安装在编译了旧 getuid
系统调用的内核上,并且只有 getuid32
在 x86-32 上可用。如果你 运行 fgrep CONFIG_UID16 "/boot/config-$(uname -r)"
,你将能够看到你的 运行ning 内核是否支持 16 位系统调用。如果此命令打印 CONFIG_UID16=y
以外的任何内容,则表示旧系统调用不可用。
如果您改为调用 SYS_getuid32
,它应该可以正常工作。请注意,SYS_getuid32
可能无法在其他架构上使用。
我想使用系统调用来获取当前用户的 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);
替换它,那么它就正确 returns 0
。我做错了什么?如何使用 syscall
?
我 运行 它在 i686/ubuntu
docker 图像上,因为我必须创建 32 位可执行文件。
最小可重现示例:
Docker 文件
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
根据 getuid(2):
The original Linux getuid() and geteuid() system calls supported only 16-bit user IDs. Subsequently, Linux 2.4 added getuid32() and geteuid32(), supporting 32-bit IDs. The glibc getuid() and geteuid() wrapper functions transparently deal with the variations across kernel versions.
显然,您正在 运行 将您的程序安装在编译了旧 getuid
系统调用的内核上,并且只有 getuid32
在 x86-32 上可用。如果你 运行 fgrep CONFIG_UID16 "/boot/config-$(uname -r)"
,你将能够看到你的 运行ning 内核是否支持 16 位系统调用。如果此命令打印 CONFIG_UID16=y
以外的任何内容,则表示旧系统调用不可用。
如果您改为调用 SYS_getuid32
,它应该可以正常工作。请注意,SYS_getuid32
可能无法在其他架构上使用。