Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么需要使用inotify_add_watch()调用read()两次_Linux_Inotify - Fatal编程技术网

Linux 为什么需要使用inotify_add_watch()调用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

在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::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时,您可能会得到两个事件:一个用于截断,另一个用于写入

如果您不同时使用这两种,下一个将立即返回