Tcl/Tk: 为什么 inotify 会忽略文件?

Tcl/Tk: why is file ignored by inotify?

我想在 tcl/tk 中使用 inotify 监控一个文件。当文件内容改变时,应该执行proc "say"。我的代码只适用于一次更改。如果我再次打开文件(我用 kwrite 打开它)并更改内容,则不会执行 proc。 "watch info" 告诉我,文件仍然被添加到实例中。 "watch read" 显示标志设置为 i,这对我来说意味着文件被实例忽略。但我不知道,为什么文件被忽略了,我没有删除文件或其他东西。你能回答一下,为什么文件被忽略了?

这是带有发射的代码:

package require inotify

1.3

proc say {fd} {
   puts "say hello"
}

if {[catch {set fd [inotify create "watch" "say"]} errfd]} {
   puts "$errfd"
   exit
}

puts $fd

7

if {[catch {watch add /home/server/Zwischenablage/pitt_an/pitt_an_dashboard.txt C} errwatch]} {
   puts "$errwatch"
   exit
}

watch info

/home/server/Zwischenablage/pitt_an/pitt_an_dashboard.txt 1 C

(这​​里我先编辑了文件)

say hello

watch info

/home/server/Zwischenablage/pitt_an/pitt_an_dashboard.txt 1 C

watch read

{watchid 1 flags i cookie 0 filename {}}

文档 (tcl-inotify.sourceforge.net) 说 "i" 标志意味着 "The watch was automatically removed, because the file was deleted or its filesystem was unmounted." 我查找了您用来修改文件的 kwrite,它创建了保存时备份。这通常通过有效地将旧文件重命名为 .backup 并在保存时创建新文件来实现。

如果 kwrite 就是这样做的,那么 inotify 运行正常 - 每次保存文件时,您都会创建一个新文件并删除旧文件,这会禁用您当前的手表。为了测试它,我通过对文件执行简单的 touch 来 "modify" 文件,看看它是否按预期工作。

如果情况确实如此,并且您仍然希望您的处理程序对已使用 kwrite 修改过的文件进行操作,那么您需要使用 IN_ONESHOT 选项设置处理程序以删除本身完全触发,然后让它在退出前在同名的新文件上设置新监视。