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

3
我希望用tcl/tk中的inotify来监控一个文件。当文件内容被更改时,应执行"say"过程。我的代码只对一次确切的更改有效。如果我再次打开文件(我使用kwrite打开它)并更改内容,则不会执行此过程。 "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

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

说你好

watch info

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

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

{watchid 1 flags i cookie 0 filename {}}

1个回答

0

文档(tcl-inotify.sourceforge.net)表示,“i”标志表示“由于文件已删除或其文件系统已卸载,监视已自动删除。” 我查了一下你正在使用的kwrite,它在保存时创建备份。这通常是通过将旧文件有效地重命名为.backup并在保存时创建新文件来实现的。

如果kwrite是这样做的话,那么inotify就正常工作了-每次保存文件时,您都会创建一个新文件并删除旧文件,这会禁用当前的监视。要测试它,我会通过对文件进行简单的 touch 来“修改”文件,并查看它是否按预期工作。

如果情况确实如此,而您仍希望处理程序在使用kwrite修改的文件上起作用,则需要使用IN_ONESHOT选项设置处理程序以完全删除自身,然后在退出之前在同名的新文件上设置一个新的监视器。


谢谢Erik,那就是我一直在寻找的答案。我不知道kwrite和其他编辑器的工作。 - A.Pitt
很高兴听到这个。如果它确实对您有效,请随意接受答案。 :) - Erik Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接