2013-04-20 100 views
1

我需要在输入通道关闭后执行一些操作。男人fileevent说:无论何时,只要通道被关闭tcl:如何处理通过文件事件读取的通道关闭

所以,如果一个通道被关闭,该处理器可能不会被调用来处理这个

的文件事件处理程序也被自动删除。当我尝试读取子进程的输出时,我可以真正看到它:以前的处理程序调用仍然将[eof $ fd]视为false,而下一个调用从不调用。

我现在可以想象的唯一方法就是执行一些像定期看门狗这样的黑客行为,检查$ fd是否仍然打开,但这非常脏。我可以肯定,当其他阅读频道打开时,$ fd不会得到相同的值吗?

+0

答案在这里:http://wiki.tcl.tk/fileevent? (一定要点击“显示讨论”) – 2013-04-21 13:37:36

回答

2

我想这里需要一些说明。当文档显示“频道已关闭”时,则表示“频道已关闭”。换句话说,直到调用[close]

如果通道从另一端关闭(例如,插座的另一端或管道的另一端),则在您自己拨打电话[close]之前,它不会被视为关闭。因此,如果通道在另一端关闭,fileevent将被执行,并且[eof]将返回true(否则读操作将会出错)。

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

+0

+1:检测封闭的网络渠道是不平凡的;如果网络进入“吞食所有数据包”模式,您将无法可靠地检测到这一事实(并且与任意长的延迟无法区分)。这与本地物理层的丢失是不同的,在这里检测是可能的(当然,如果不总是微不足道的话)。 – 2013-04-22 09:13:02