inotify 中, 在 read 其 struct inotify_event 时, 缓冲区必须大于读取的结构体的大小

本文深入探讨了Linux中inotify提供的监控文件变化的功能,包括inotify_init(), inotify_add_watch() 和 inotify_rm_watch() 函数的使用。详细解析了inotify事件结构及其特性,以及如何有效地读取和处理这些事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 linux中监控文件的 inotify 提供了以下几个编程函数, inotify_init(), inotify_add_watch(), 

inotify_rm_watch(). 从 inotify_init() 返回的文件描述符 read, 读取监听到的事件. 

事件的结构为:

 struct inotify_event {
             int      wd;       /* Watch descriptor */
             uint32_t mask;     /* Mask of events */
             uint32_t cookie;   /* Unique cookie associating related
                                   events (for rename(2)) */
             uint32_t len;      /* Size of ’name’ field */
             char     name[];   /* Optional null-terminated name */
         };
因为每个文件名的长度不定, 所以每个事件占用的内存大小也不一定相等.

假设 EVENT_LEN = sizeof(sturct inotify_event),  NAME_LEN = len (事件结构体中的len, 为保持内存对齐, 可能大于 strlen(name));

假设inotify的事件队列中有很多未读取的, 读取事件 ret =  read(fd, buf, BUF_LEN);  

如果 BUF_LEN < EVENT_LEN + NAME_LEN,   ret = 0;

如果 EVENT_LEN + NAME_LEN <= BUF_LEN < 2 * (EVENT_LEN + NAME_LEN ), ret = EVENT_LEN + NAME_LEN;

如果 2 * (EVENT_LEN + NAME_LEN)  <= BUF_LEN < 3* (EVENT_LEN + NAME_LEN _, ret = 2 * (EVENT_LEN + NAME_LEN );

  ......

也就是, 只能整个的读取 struct inotify_event, 不能读取部分结构.

- - - - - - - -

以上是我个人的测试.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值