gpt4 book ai didi

c - inotify 无法对 IN_DELETE 使用react

转载 作者:太空狗 更新时间:2023-10-29 15:33:32 28 4
gpt4 key购买 nike

我有以下(粗略的)功能,它会持续监视目录中的新文件和正在删除的文件,并记录此类更改。它正确地记录了所有新文件和目录,但似乎对被删除的文件或目录没有任何反应。

似乎是 read() 调用在删除文件时没有返回,尽管它在创建文件时返回。

该函数作为两个独立线程之一被调用,尽管目前另一个线程不执行任何操作(只是一个空的无限循环作为占位符)。

void* watchfs(void* arg) {
int infp, watch, length, i ;
char buffer[EVENT_BUF_LEN] ;
struct inotify_event* event ;

if ((infp = inotify_init()) < 0) {
fatal("inotify: Could not initialize") ;
}

watch = inotify_add_watch(infp, userdir, IN_CREATE | IN_DELETE) ;

for (;;) {
length = read(infp, buffer, EVENT_BUF_LEN) ;
if (length < 0) {
fatal("inotify: Could not read events") ;
}

i = 0 ;
while (i < length) {
event = (struct inotify_event*) &buffer[i] ;

if (event->len) {
if (event->mask & IN_CREATE) {
if (event->mask & IN_ISDIR) {
record(LOG_FILESYS, "New directory created") ;
} else {
record(LOG_FILESYS, "New file created") ;
}
} else if (event->mask & IN_DELETE) {
if (event->mask & IN_ISDIR) {
record(LOG_FILESYS, "Directory deleted") ;
} else {
record(LOG_FILESYS, "File deleted") ;
}
}
}

i += EVENT_SIZE + event->len ;
}
}

inotify_rm_watch(infp, watch) ;
close(infp) ;

return 0 ;
}

最佳答案

终于明白是怎么回事了。 Linux,或者可能是 Gnome,实际上并不删除文件,而只是简单地移动它们。即使只是简单地重命名文件,它显然也已移动到某处,然后将具有新名称的新文件从其他地方(某处的临时文件夹?)移动到文件夹中。 rm 命令实际上删除了一个文件,我的代码按预期将其注册为 IN_DELETE 事件。然而,在 Gnome 中删除文件或目录会注册为 IN_MOVED_TO,而重命名则注册为 IN_MOVED_TO,后跟 IN_MOVED_FROM

我以为我已经检查过这个作为第一件事,但显然还不够好。

关于c - inotify 无法对 IN_DELETE 使用react,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8334676/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com