代码之家  ›  专栏  ›  技术社区  ›  Edward Falk

inotify事件读取是否保证不会在缓冲区之间拆分?

  •  0
  • Edward Falk  · 技术社区  · 4 年前

    #define EVENT_SIZE  (sizeof (struct inotify_event))
    
    #define BUF_LEN        (1024 * (EVENT_SIZE + NAME_MAX + 1))
    
    char buf[BUF_LEN];
    
    num = read(_fd, buf, BUF_LEN);
    

    所以假设这允许一个 read() 调用以返回多达1024个事件。

    如果队列中的事件实际上比这个多怎么办?inotify会保证返回完整数量的事件吗,即使这意味着短读?或者inotify会将事件拆分为两次读取吗?

    0 回复  |  直到 4 年前
        1
  •  2
  •   InterLinked    4 年前

    man 第页,共页 inotify :

    指定读取(2)的缓冲区太小而无法返回时的行为 关于下一个事件的信息取决于内核版本:在 失败,错误为EINVAL。指定大小的缓冲区

    sizeof(struct inotify\u事件)+NAME\u MAX+1

    足以读取至少一个事件。

    所以历史上它是圆的 向下 EINVAL .