私は組み込み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();
...
しかし、質問は残ります。なぜサイズが違うのですか?