2016-09-24 1 views
0

En utilisant les dernières sources de apple's open source repo j'ai tiré la structure suivante pour la « stat » struct (dans la syntaxe go):Pourquoi le décalage de champ st_size 96 de stat sur OSX 64 bits peut-il être calculé?

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! */ 
} 

mais en pratique, il se trouve st_size a un décalage de 96 octets au lieu de 60 montré ci-dessus. Quelle est la cause de cette divergence et comment cela peut-il être vu à partir du code source original?

Répondre

1

Sous OS X, les deux zones de struct timespec sont long, soit 64 bits dans la convention LP64 habituelle. Par conséquent, sizeof(struct timespec) == 16 (vous pouvez le vérifier vous-même), et il est aligné sur une limite de 64 bits, ce qui vous donne un décalage de 96 pour st_size.