【问题标题】:Tcl/Tk: why is file ignored by inotify?Tcl/Tk:为什么文件被 inotify 忽略?
【发布时间】:2015-08-22 06:52:12
【问题描述】:

我想通过在 tcl/tk 中使用 inotify 来监控文件。当文件内容改变时,应该执行proc“say”。我的代码适用于确切的一项更改。如果我再次打开文件(我用 kwrite 打开它)并更改内容,则不会执行 proc。 “观看信息”告诉我,该文件仍被添加到实例中。 “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

watch read

{watchid 1 flags i cookie 0 filename {}}

【问题讨论】:

    标签: tcl tk inotify


    【解决方案1】:

    文档 (tcl-inotify.sourceforge.net) 说“i”标志意味着“手表被自动删除,因为文件被删除或其文件系统被卸载。”我查找了您用来修改文件的 kwrite,它会在保存时创建备份。这通常通过有效地将旧文件重命名为 .backup 并在保存时创建新文件来实现。

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

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

    【讨论】:

    • 感谢 Erik,这就是我正在寻找的答案。我不知道 kwrite 和其他编辑的工作。
    • 很高兴听到这个消息。如果它真的对您有用,请随时接受答案。 :)
    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 2021-11-06
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多