使用INotify监视具有多个符号链接的文件

时间:2015-02-27 16:13:45

标签: c++ c linux symlink inotify

所以我设置了一些代码来观看编辑的配置文件,直到我使用VIM编辑文件,然后我还必须查看目录以进行重命名和创建。然后我发现在路径层次结构中没有捕获更高的重命名。然后我查看了符号链接...... gaaahhhh!

首先设置一个示例,显示一个(很多)棘手的符号链接场景:

mkdir config1
touch config1/config
ln -s config1 machine1

mkdir config2
touch config2/config
ln -s config2 machine2

ln -s machine1 active

现在,给定一个我想要观看的像active / config这样的文件名,我可以看到如何获取一个inotify监视描述符:

config1/ -> watch active/ follow symlinks (watches inode for config1)
active/ -> watch active/ dont follow symlinks (watches inode for active symlink
active/config -> watch active/config (watches inode for config1/config)

如何在machine1符号链接上添加手表?我是否需要找到一些方法来手动遍历每个符号链接为每个添加手表?怎么样?

目的是允许:

mkdir config3
touch config3/config
ln -s -f -n config3 machine1

并且有inotify警告active / config已被重定向。目前看起来我必须添加一个手表:

- target file inode
- every directory inode leading to the file (to detect moves/renames of directories)
- every symlink inode involved in reaching any of the above

必须有一种更简单的方法来观看一个文件?我是偏离了这条道路还是真的这样?

1 个答案:

答案 0 :(得分:3)

我的回答是直接的,是的,你做得对,"。

在仔细阅读inotify syscall manpage之后,我看不出任何方法没有看到(可能是符号链接的)路径到文件的每一步,以便检测到完整路径的任何和所有更改

这似乎是inotify的工作方式:它只查看特定的文件或文件夹,并且它不会自行进行递归。这一点,加上必须明确遵循符号链接,似乎与你的三步计划相符。

联机帮助页中的选定引号:

  

调用inotify_add_watch(2)时,可以在掩码中指定以下其他位:       IN_DONT_FOLLOW(自Linux 2.6.15起)

     

如果是符号链接,请不要取消引用路径名。

[...]

  

限制和警告

     

目录的Inotify监控不是递归的:要监视目录下的子目录,必须创建其他监视。对于大型目录树,这可能需要相当长的时间。 [...]

FAQ还支持您的策略重新符号链接:

  

问:IN_ONLYDIR和IN_DONT_FOLLOW标志怎么样?   IN_ONLYDIR确保事件仅在目录上发生。如果在文件上创建此类监视,则不会发出事件。 IN_DONT_FOLLOW禁止跟随符号链接(这些链接将被自己监视,而不是它们指向的文件)。