inotify_event结构如下所示:
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 */
};
名称部分仅存储文件名(不是文件的路径)。我们如何从inotify_event结构中获取完全限定的路径,或者我必须在其周围包装自己的结构?
编辑:我等待事件大约2秒,然后一次处理。我维护一个事件队列。我的问题是我是否只能从inotify_event结构中获取我的文件的完整路径?
每秒事件数量很大。
答案 0 :(得分:5)
有两种选择:
您正在观看文件。您已将其名称传递给inotify_add_watch
,并获得了一个监视描述符。如果你得到一个事件,你可以通过监视描述符找出该文件。
您正在观看目录。同样,您已将目录名称传递给inotify_add_watch
,并且可以根据监视ID找到它的名称。现在inotify_event.name
包含文件名。连接这两个,你就完成了。
答案 1 :(得分:1)
我认为你需要跟踪每个手表描述符,因为你在一些结构中添加它们(当你添加它时都有完整的路径)。然后,当您收到事件时,请在事件中使用wd查找该结构中的完整路径。
wd标识发生此事件的监视。它是其中之一 通过之前调用inotify_add_watch(2)返回的监视描述符。
http://www.kernel.org/doc/man-pages/online/pages/man7/inotify.7.html
希望有帮助...
答案 2 :(得分:1)
将生成的监视描述符与您添加的要监视的路径关联(使用结构)。因此,您将创建一个手表列表。当您获得包含监视描述符的事件时,您将从监视列表中找到与此监视描述符关联的路径。将从事件结构中获得的名称与从监视列表中获得的路径连接起来。此外,当您添加路径进行观看时,此时您还会以添加父路径的相同方式递归添加所有子路径。< / p>
答案 3 :(得分:0)
这是可以的,但它不是完整的答案。
如果你有一个目录结构而且你正在观看文件&amp; dir事件,它看起来像这样:/ root / dir1&amp; / root / dir2,即使在将它们添加到监视列表后,您也无法正确解析在dir1或dir2中创建文件或目录的位置。
Inotify返回项目的名称,但不会告诉您它在哪个目录。
答案 4 :(得分:0)
inotify系统,使用连续数字作为手表描述符,假设您想要观看3个目录,.. / A,.. / B和../C,如果我们说,我在里面创建一个文件../A,那么从read()返回的监视描述符将是1.,如果我在../C中创建一个文件,则监视描述符将为3,依此类推。因此,关联非常简单,您可以使用路径创建数组,并将inotify_add_watch()应用于每个路径,然后,如果事件具有监视描述符x,则只需将pathsArray [x-1]与event-&gt; name,你有路径:)
std::string getPathFromEvent(struct inotify_event *ptr){
std::stringstream builder ;
builder<<directories->DetectedDirectories.operator[](ptr->wd-1).string();
builder<<ptr->name;
return builder.str();
}