Linux 为什么需要使用inotify_add_watch()调用read()两次
在linux文件系统(linux内核4.9.0)上,当文件被修改时,我试图使用inotify_add-watch()获取通知 但在收到通知后,read()将调用两次,直到收到对文件/etc/temp进行下一次修改的通知为止。有人能解释一下为什么我需要调用read()两次吗?多谢各位Linux 为什么需要使用inotify_add_watch()调用read()两次,linux,inotify,Linux,Inotify,在linux文件系统(linux内核4.9.0)上,当文件被修改时,我试图使用inotify_add-watch()获取通知 但在收到通知后,read()将调用两次,直到收到对文件/etc/temp进行下一次修改的通知为止。有人能解释一下为什么我需要调用read()两次吗?多谢各位 int fd, wd; fd = inotify_init (); if (fd < 0) { perror ("inotify_init () = "); } else { std::str
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));
}
}
intfd,wd;
fd=inotify_init();
如果(fd<0)
{
perror(“inotify_init()=”);
}
其他的
{
std::string filename=“/etc/test”;
wd=inotify\u add\u watch(fd,filename.c\u str(),IN\u MODIFY);
如果(wd<0)
{
佩罗(inotify_add_watch);
}
其他的
{
char*buffer=新字符[1024];
while(true)
{
//先读取块,直到/etc/temp文件被修改,
//它返回16,即sizeof(struct inotify_事件)
printf(“第一次读取%d),读取(fd,缓冲区,1024));
//second read()不阻塞,read再次返回16
printf(“第二次读取%d),读取(fd,缓冲区,1024));
}
}
}您必须先使用所有挂起的事件,然后它才会再次开始阻塞 例如,当您执行echo foo>/etc/test时,您可能会得到两个事件:一个用于截断,另一个用于写入
如果不同时使用这两个事件,下一个事件将立即返回。必须先使用所有挂起的事件,然后它才会再次开始阻塞 例如,当您执行echo foo>/etc/test时,您可能会得到两个事件:一个用于截断,另一个用于写入 如果您不同时使用这两种,下一个将立即返回