GLIBC 2.38로 빌드된 Linux에서 /var/run/utmp와 `struct utmp` 간의 크기 불일치(Y2k38 수정)

GLIBC 2.38로 빌드된 Linux에서 /var/run/utmp와 `struct utmp` 간의 크기 불일치(Y2k38 수정)

저는 임베디드 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).

gettybuildroot 를 갖고 빌드하세요 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/utmp384 입니다.

# 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_tlogingetty
/var/run/utmptimeval_t

왜 불일치가 있는지 모르겠습니다(코드에서 보고된 크기는 struct utmp400이지만 생성된 파일은 struct utmp384입니다). GLIBC에서 온 것입니까, 아니면 busybox?

감사해요,

답변1

/var/run/utmpwho.cbusybox를 참고하여 올바른 읽기에 대한 해결책을 찾았습니다 .

    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();
...

하지만 질문은 남아있습니다. 왜 크기가 다른가요?

관련 정보