で見てきたstat構造体は、実際どのような構造になってるのでしょう。
man 2 statで確認。
これらのシステムコールはいずれも、結果を stat 構造体に入れて返す。 stat 構造体には以下のフィールドが含まれている: struct stat { dev_t st_dev; /* ファイルがあるデバイスの ID */ ino_t st_ino; /* inode 番号 */ mode_t st_mode; /* アクセス保護 */ nlink_t st_nlink; /* ハードリンクの数 */ uid_t st_uid; /* 所有者のユーザー ID */ gid_t st_gid; /* 所有者のグループ ID */ dev_t st_rdev; /* デバイス ID (特殊ファイルの場合) */ off_t st_size; /* 全体のサイズ (バイト単位) */ blksize_t st_blksize; /* ファイルシステム I/O での ブロックサイズ */ blkcnt_t st_blocks; /* 割り当てられた 512B のブロック数 */ }; /* Linux 2.6 以降では、カーネルは以下のタイムスタンプ フィールドでナノ秒の精度をサポートしている。 Linux 2.6 より前のバージョンでの詳細は 下記の「注意」を参照。 */ struct timespec st_atim; /* 最終アクセス時刻 */ struct timespec st_mtim; /* 最終修正時刻 */ struct timespec st_ctim; /* 最終状態変更時刻 */ #define st_atime st_atim.tv_sec /* 後方互換性 */ #define st_mtime st_mtim.tv_sec #define st_ctime st_ctim.tv_sec };
まあこれで十分なんですが、ヘッダがどこにあるか知りたいです。
カーネルのソースなので、そちらから探します。
takk@deb9:~$ cd /usr/src/linux takk@deb9:/usr/src/linux$
メンバであるst_devでひっかけます。
takk@deb9:/usr/src/linux$ grep -rl 'st_dev;' * arch/alpha/kernel/osf_sys.c arch/alpha/include/uapi/asm/stat.h arch/sparc/include/uapi/asm/stat.h arch/sparc/include/asm/compat.h arch/arm/kernel/sys_oabi-compat.c arch/arm/include/uapi/asm/stat.h arch/arm64/include/asm/compat.h arch/arm64/include/asm/stat.h arch/m68k/include/uapi/asm/stat.h arch/um/include/shared/os.h arch/ia64/include/uapi/asm/stat.h arch/cris/include/uapi/asm/stat.h arch/mips/include/uapi/asm/stat.h arch/mips/include/asm/compat.h arch/sh/include/uapi/asm/stat.h arch/parisc/include/uapi/asm/stat.h arch/parisc/include/asm/compat.h arch/powerpc/include/uapi/asm/stat.h arch/powerpc/include/asm/compat.h arch/avr32/include/uapi/asm/stat.h arch/m32r/include/uapi/asm/stat.h arch/x86/include/uapi/asm/stat.h arch/x86/include/asm/compat.h arch/x86/include/asm/ia32.h arch/frv/include/uapi/asm/stat.h arch/blackfin/include/uapi/asm/stat.h arch/s390/kernel/compat_linux.c arch/s390/include/uapi/asm/stat.h arch/s390/include/asm/compat.h arch/xtensa/include/uapi/asm/stat.h arch/mn10300/include/uapi/asm/stat.h drivers/crypto/caam/jr.c drivers/misc/vmw_vmci/vmci_host.c drivers/scsi/storvsc_drv.c drivers/scsi/qla2xxx/qla_init.c drivers/scsi/scsi_lib.c drivers/ata/ahci.h drivers/media/dvb-frontends/stv090x.c drivers/media/platform/vsp1/vsp1_entity.h drivers/target/target_core_xcopy.c drivers/target/target_core_xcopy.h drivers/net/arcnet/com20020.h drivers/staging/most/hdm-usb/hdm_usb.c drivers/ide/ide.c fs/nfsd/vfs.c fs/exofs/ore.c fs/exofs/ore_raid.c fs/exofs/exofs.h include/uapi/asm-generic/stat.h include/scsi/osd_ore.h include/scsi/scsi_host.h include/linux/nubus.h include/net/dsa.h net/ipv4/ipconfig.c sound/soc/intel/skylake/skl-sst-dsp.c sound/soc/intel/common/sst-firmware.c sound/soc/intel/common/sst-dsp-priv.h takk@deb9:/usr/src/linux$
結果からなんとなく、stat.hが怪しいです。各プロセッサ別にヘッダが存在してるっぽく、かつ一番分かりやすい名前といえば、stat.hってことで。
findでstat.hの一覧を取得。
takk@deb9:/usr/src/linux$ find -name stat.h ./arch/alpha/include/uapi/asm/stat.h ./arch/sparc/include/uapi/asm/stat.h ./arch/arm/include/uapi/asm/stat.h ./arch/arm64/include/uapi/asm/stat.h ./arch/arm64/include/asm/stat.h ./arch/m68k/include/uapi/asm/stat.h ./arch/score/include/uapi/asm/stat.h ./arch/ia64/include/uapi/asm/stat.h ./arch/cris/include/uapi/asm/stat.h ./arch/mips/include/uapi/asm/stat.h ./arch/sh/include/uapi/asm/stat.h ./arch/parisc/include/uapi/asm/stat.h ./arch/tile/include/uapi/asm/stat.h ./arch/powerpc/include/uapi/asm/stat.h ./arch/avr32/include/uapi/asm/stat.h ./arch/m32r/include/uapi/asm/stat.h ./arch/x86/include/uapi/asm/stat.h ./arch/frv/include/uapi/asm/stat.h ./arch/blackfin/include/uapi/asm/stat.h ./arch/microblaze/include/uapi/asm/stat.h ./arch/s390/include/uapi/asm/stat.h ./arch/xtensa/include/uapi/asm/stat.h ./arch/mn10300/include/uapi/asm/stat.h ./tools/perf/util/stat.h ./include/uapi/asm-generic/stat.h ./include/uapi/linux/stat.h ./include/linux/stat.h takk@deb9:/usr/src/linux$
間違いないですね。プロセッサ別にあるので、stat.hにstat構造体が書かれてる推測が有力です。
私のPCはx86なので、以下のヘッダから構造体を抽出します。
./arch/x86/include/uapi/asm/stat.h
struct statはこのようになってました。
struct stat { __kernel_ulong_t st_dev; __kernel_ulong_t st_ino; __kernel_ulong_t st_nlink; unsigned int st_mode; unsigned int st_uid; unsigned int st_gid; unsigned int __pad0; __kernel_ulong_t st_rdev; __kernel_long_t st_size; __kernel_long_t st_blksize; __kernel_long_t st_blocks; /* Number 512-byte blocks alloca __kernel_ulong_t st_atime; __kernel_ulong_t st_atime_nsec; __kernel_ulong_t st_mtime; __kernel_ulong_t st_mtime_nsec; __kernel_ulong_t st_ctime; __kernel_ulong_t st_ctime_nsec; __kernel_long_t __unused[3]; };
なんだか、man 2 statで書いてあることと違う気がするので、合ってるか分かりません。
前回gdbで確認した構造体の表示を照らし合わせてみます。
(gdb) p buf $1 = {{st_dev = 0, st_ino = 0, st_nlink = 0, st_mode = 0, st_uid = 0, st_gid = 0, __pad0 = 0, st_rdev = 0, st_size = 0, st_blksize = 15775487, st_blocks = 194, st_atim = {tv_sec = 140737488347039, tv_nsec = 140737488347038}, st_mtim = {tv_sec = 140737348710373, tv_nsec = 1}, st_ctim = {tv_sec = 93824992233293, tv_nsec = 0}, __glibc_reserved = {0, 93824992233216, 93824992232832}}} (gdb)
微妙に時間の構造体が違ってる気がします。
続く
コメント