gpt4 book ai didi

linux - 为什么需要用 inotify_add_watch() 调用 read() 两次

转载 作者:太空宇宙 更新时间:2023-11-04 09:13:21 25 4
gpt4 key购买 nike

我正在尝试在文件被修改时使用 inotify_add-watch() 获取通知 (inotify_add_watch (fd, filename.c_str(), IN_MODIFY);) 在 linux 文件系统上(linux 内核 4.9.0)。

但是在收到通知后,read() 预计会调用两次,直到我收到文件/etc/temp 的下一次修改通知。有人可以澄清为什么我需要调用 read() 两次吗?谢谢。

int fd, wd;
fd = inotify_init ();

if (fd < 0)
{
perror ("inotify_init () = ");
}
else
{
std::string filename = "/etc/test";
wd = inotify_add_watch (fd, filename.c_str(), IN_MODIFY);

if (wd < 0)
{
perror ("inotify_add_watch");
}
else
{
char* buffer = new char[1024];
while(true)
{
//first read blocks until the /etc/temp file is modified,
//it returns 16 which is sizeof(struct inotify_event)
printf("first read %d), read( fd, buffer, 1024));

//second read() does not block and read returns 16 again
printf("second read %d), read( fd, buffer, 1024));
}
}

最佳答案

在它再次开始阻塞之前,您必须消耗所有未决事件。

当你例如执行 echo foo >/etc/test,您可能会得到两个事件:一个用于截断,一个用于写入。

如果你两个都不消费,下一个会立即返回。

关于linux - 为什么需要用 inotify_add_watch() 调用 read() 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51902640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com