我正在开发一个嵌入式Linux系统(kernel-5.10.24),这是一个32位系统,它正在使用 GLibc-2.38 来修复 Y2k38。
rootfs 是根据 buildroot rel.2023-aug 构建的,并带有 Y2k38 修复。 (用 构建 -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
)。
有getty
并从buildroot 中login
构建。busybox-1.36.1
现在,当我尝试/var/run/utmp
使用以下代码(也使用 构建-D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
)阅读时,我发现了奇怪的事情。
#include <stdio.h>
#include <utmp.h>
#include <time.h>
#include <string.h>
int main() {
FILE *fp;
struct utmp ut;
printf("XXXXXXXXX sizeof utmp: %ld\n", sizeof(ut));
fp = fopen("/var/run/utmp", "r");
if (fp == NULL) {
perror("Error opening UTMP file");
return 1;
}
while (fread(&ut, sizeof(struct utmp), 1, fp) == 1) {
if (ut.ut_type == USER_PROCESS) {
printf("Login Name: %s\n", ut.ut_user);
printf("Login Time: %s", ctime(&ut.ut_tv.tv_sec));
}
}
fclose(fp);
return 0;
}
当 root 登录并运行代码时,它显示,
# /tmp/utmpread
XXXXXXXXX sizeof utmp: 400
但大小/var/run/utmp
是384。
# stat /var/run/utmp
File: /var/run/utmp
Size: 384 Blocks: 8 IO Block: 4096 regular file
Device: fh/15d Inode: 8 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 1970-01-01 01:14:24.270002128 +0000
Modify: 1970-01-01 00:03:12.000000000 +0000
Change: 1970-01-01 01:12:47.210002082 +0000
因此,根据我的测试,似乎struct utmp
已经构建为 64 位timeval_t
,并且login
还getty
报告其大小为 400Bytes。
但大小/var/run/utmp
仍然是 384 Bytes,即使用 32bit timeval_t
。
我不知道为什么会出现不匹配(代码报告的大小是struct utmp
400,但生成的文件struct utmp
是384),是来自GLIBC还是来自busybox
?
谢谢,
答案1
/var/run/utmp
我通过参考who.c
busybox找到了正确读取的解决方案。
struct utmp *ut;
setutent();
while ((ut = getutent()) != NULL) {
if (ut->ut_type == USER_PROCESS) {
if (strcmp(ut->ut_user, "root") == 0) {
printf("root logged in\n");
}
}
}
endutent();
...
但问题仍然存在,为什么尺寸不同?