tcl:如何处理关闭fileevent readable正在读取的通道

tcl:如何处理关闭fileevent readable正在读取的通道,tcl,Tcl,我需要在输入通道关闭后执行一些操作。这一事件说: 文件事件处理程序在其通道关闭时也会自动删除 因此,如果通道已关闭,则可能不会调用处理程序来处理此问题。实际上,我在尝试读取子进程的输出时可以看到它:上一次调用handler时仍将[eof$fd]视为false,而下一次调用则从未调用过 我现在能想象的唯一方法是实施一些黑客行为,比如定期检查$fd是否仍然打开,但这相当肮脏。我是否可以确定,当打开其他读取通道时,$fd不会得到相同的值?我认为这里需要一些澄清。当文档说“频道关闭”时,它意味着“您的节

我需要在输入通道关闭后执行一些操作。这一事件说:

文件事件处理程序在其通道关闭时也会自动删除

因此,如果通道已关闭,则可能不会调用处理程序来处理此问题。实际上,我在尝试读取子进程的输出时可以看到它:上一次调用handler时仍将[eof$fd]视为false,而下一次调用则从未调用过


我现在能想象的唯一方法是实施一些黑客行为,比如定期检查$fd是否仍然打开,但这相当肮脏。我是否可以确定,当打开其他读取通道时,$fd不会得到相同的值?

我认为这里需要一些澄清。当文档说“频道关闭”时,它意味着“您的节目中的频道已关闭”。换句话说,直到调用
[close]

如果通道从另一端(例如插座的另一端或管道的另一端)关闭,则在您自己调用
[close]
之前,不会认为通道在您一侧关闭。因此,如果通道在另一端关闭,将执行fileevent,并且
[eof]
将返回true(或者读取操作将出错)


我从未遇到过tcl检测到通道已关闭而不调用fileevent的情况。我认为这是不可能的。但是,在某些情况下,通道实际上是死的,但没有关闭(通常是由于网络错误或另一端的机器重新启动)。对于这种情况,您需要实现超时。但超时并不意味着频道已经关闭。这只意味着你不再相信通道另一端的机器还活着。

这里的答案是:?(请务必单击“显示讨论”)+1:检测关闭的网络通道是非常重要的;如果网络进入“吞下所有数据包”模式,您就无法可靠地检测到这一事实(这与任意长的延迟是无法区分的)。这不同于本地物理层的丢失,在本地物理层中可以进行检测(当然,即使不总是微不足道的)。