저는 임베디드 Linux 시스템(kernel-5.10.24)을 개발 중입니다.32비트시스템에서는 GLibc-2.38을 사용하여 Y2k38을 수정합니다.
rootfs는 Y2k38 수정 사항이 포함된 buildroot rel.2023-aug에 대해 구축되었습니다. (빌드 포함 -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
이제 다음 코드(또한 build 사용)를 사용하여 읽으 려고 하면 -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;
}
루트가 로그인하여 표시된 코드를 실행하면,
# /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
그래서 제가 테스트한 결과 64 비트로 struct utmp
구축되었으며 크기 도 400바이트로 보고된 것으로 나타났습니다. 하지만 32비트를 사용해도 크기는 여전히 384바이트입니다 .timeval_t
login
getty
/var/run/utmp
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();
...
하지만 질문은 남아있습니다. 왜 크기가 다른가요?