从inotify_event中检索完整路径名

时间:2012-02-16 14:39:47

标签: c linux inotify

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结构中获取我的文件的完整路径?

每秒事件数量很大。

5 个答案:

答案 0 :(得分:5)

有两种选择:

  1. 您正在观看文件。您已将其名称传递给inotify_add_watch,并获得了一个监视描述符。如果你得到一个事件,你可以通过监视描述符找出该文件。

  2. 您正在观看目录。同样,您已将目录名称传递给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();
}