2016-09-24 9 views
0

Используя новейшие источники из apple's open source repo я вывел следующую структуру для «стата» структур (в ходе синтаксиса):Почему stat st_size смещение поля 96 на 64-битной OSX и может ли он быть рассчитан?

type timespec struct { 
    tv_sec  int32 
    tv_nsec  uint32 
} 

type stat64 struct { 
    st_dev  int32   /* [XSI] ID of device containing file */ 
    st_mode  uint16   /* [XSI] Mode of file (see below) */ 
    st_nlink uint16   /* [XSI] Number of hard links */ 
    st_ino  uint64   /* [XSI] File serial number */ 
    st_uid  uint32   /* [XSI] User ID of the file */ 
    st_gid  uint32   /* [XSI] Group ID of the file */ 
    st_rdev  int32   /* [XSI] Device ID */ 

    st_atimespec  timespec /* time of last access */ 
    st_mtimespec  timespec /* time of last data modification */ 
    st_ctimespec  timespec /* time of last status change */ 
    st_birthtimespec timespec /* time of file creation(birth) */ 

    st_size  int64   /* [XSI] file size, in bytes */ 
    st_blocks int64   /* [XSI] blocks allocated for file */ 
    st_blksize int32   /* [XSI] optimal blocksize for I/O */ 
    st_flags uint32   /* user defined flags for file */ 
    st_gen  uint32   /* file generation number */ 
    st_lspare int32   /* RESERVED: DO NOT USE! */ 
    st_qspare [2]int64  /* RESERVED: DO NOT USE! */ 
} 

, но на практике оказывается st_size имеет смещение 96 байт вместо 60 показано выше. В чем причина этого несоответствия и как это можно увидеть из исходного исходного кода?

ответ

1

В OS X оба поля struct timespec: long, что является 64-разрядным в обычном соглашении LP64. Поэтому sizeof(struct timespec) == 16 (вы можете проверить это самостоятельно), и он выровнен на 64-битной границе, что дает вам смещение 96 для st_size.

 Смежные вопросы

  • Нет связанных вопросов^_^