最近在使用inotify做文件系统变化的监控时,对inotify_event中的name的内存对齐理解出现了误差,在此记录一下。
文件事件通过inotify_event 结构体表示,它通过使用文件读取函数 read (文件描述符由inotify_init() 返回)来获得,结构体内容如下:
struct inotify_event {
__s32 wd; /* watch descriptor */
__u32 mask; /* watch mask */
__u32 cookie; /* cookie to synchronize two events */
__u32 len; /* length (including nulls) of name */
char name[0]; /* stub for possible name */
};
结构中的 wd 为被监视目标的 watch 描述符,mask 为事件掩码,len 为 name字符串的长度,name 为被监视目标的路径名,该结构的 name 字段为一个桩,它只是为了用户方面引用文件名,文件名是变长的,它实际紧跟在该结构的后面,文件名将被 0 填充以使下一个事件结构能够 4 字节对齐。注意,len 也把填充字节数统计在内,在实际使用时,最好通过strlen来获取文件名的真实长度。
参考博客: