如何使用inotify

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用inotify相关的知识,希望对你有一定的参考价值。

参考技术A const char *path是要监控的文件(目录)的路径。 uint32_t mask是:
还有非常多的事件可以使用。使用man inotify可以查看所有可以监听的事件。 mask是上面这些事件的或。例如IN_ACCESS|IN_MODIFY。 返回值:wd表示对那个文件进行监控。
删除监视对象:int inotify_rm_watch(int fd, uint32_t wd); 参数fd是inotify_init的返回值。 wd是inotify_add_watch的返回值。 inotify_rm_watch删除对wd所指向的文件的监控。读取监控发生的事件: size_t len = read(fd, buf, BUF_LEN); 读取事件数据,buf应是一个指向inotify_event结构数组的指针。不过要注意的是inotify_event的name成员长度是可变的,这个问题后面再解释。 注意:其中buf是一个指向struct inotify_event数组的指针。 由于struct inotify_event长度是可变的,因此在读取inotify_event数组内容的时候需要动态计算一下时间数据的偏移量。index += sizeof(struct inotify_event)+event->len,len即name成员的长度。 其实还是没有讲的很清楚,不过看了下面的例子,一定非常清楚:#include <stdio.h>
#include <unistd.h>
#include <sys/select.h>
#include <errno.h>
#include <sys/inotify.h>
static void _inotify_event_handler(struct inotify_event *event) //从buf中取出一个事件。printf("event->mask: 0x%08x\n", event->mask);
printf("event->name: %s\n", event->name);
int main(int argc, char **argv)if (argc != 2)
printf("Usage: %s <file/dir>\n", argv[0]);return -1;
unsigned char buf[1024] = 0;
struct inotify_event *event = NULL; int fd = inotify_init(); //初始化 int wd = inotify_add_watch(fd, argv[1], IN_ALL_EVENTS); //监控指定文件的ALL_EVENTS。for (;;) fd_set fds;
FD_ZERO(&fds);
FD_SET(fd, &fds); if (select(fd + 1, &fds, NULL, NULL, NULL) > 0) //监控fd的事件。当有事件发生时,返回值>0
int len, index = 0;
while (((len = read(fd, &buf, sizeof(buf))) < 0) && (errno == EINTR)); //没有读取到事件。 while (index < len)
event = (struct inotify_event *)(buf + index);
_inotify_event_handler(event); //获取事件。
index += sizeof(struct inotify_event) + event->len; //移动index指向下一个事件。

如何使用 webdav 从 inotify 获取实名

【中文标题】如何使用 webdav 从 inotify 获取实名【英文标题】:how to get realname from inotify with webdav 【发布时间】:2013-03-23 11:55:49 【问题描述】:

我有一个 php 脚本来监视 webdav 目录中的新/更改文件。 但是当目录中有任何操作时,inotify 只会返回一个临时名称(.davfs.tmp251671)。不是实际的文件名。

我可以从 inotify 和 webdav 获得真实的文件名吗?

【问题讨论】:

【参考方案1】:

找到了解决方案。 我使用 IN_CREATE(并用于测试 IN_CLOSE)作为触发器 但这给了我上述结果。临时名称.. 所以我使用 IN_ALL_EVENTS 进行测试。 发现掩码 128 给出了文件的实名。 但是... 根据http://www.php.net/manual/en/inotify.constants.php IN_MOVED_FROM = 64 但是在测试 IN_CREATE 时给出了 256 所以在 php 手册网站上显示的顺序是不正确的。 我现在将数值 128 用于 add_watch。它有效!

【讨论】:

遇到了同样的问题。 128 是IN_MOVED_TO,这就是为您提供真实文件名的事件。基本上创建了一个临时目录(IN_CREATE),然后重命名(IS_MOVED_FROMIS_MOVED_TO,两者都使用相同的 cookie)。所以检查两个重命名事件,最后一个给你真名

以上是关于如何使用inotify的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 webdav 从 inotify 获取实名

如何在 PHP7.4 中使用 inotify

如何有效地使用 iNotify 和 rSyslog 缓存?

如何在 C 中使用 inotify?

如何使用inotify自动删除linux中创建的文件?

如何监视文件并在终端中打印出更改(使用 inotify)?