我需要在输入通道关闭后执行一些操作。 man fileevent说:
文件事件处理程序在其频道关闭时也会自动删除
因此,如果某个频道已关闭,则可能不会调用该处理程序来处理此问题。当我尝试从子进程读取输出时,我实际上可以看到它:前面的处理程序调用仍然将[eof $ fd]视为false,而下一个永远不会被调用。
我现在能想象的唯一方法是实现一些像定期看门狗一样的黑客,它会检查$ fd是否仍然打开,但这很脏。我可以确定当其他读取通道打开时,$ fd将不会获得相同的值吗?
答案 0 :(得分:2)
我认为这里需要澄清一些。当文档说“频道关闭”时,意味着“频道在您的节目中关闭”。换句话说,直到你致电[close]
。
如果通道从另一端(例如插座的另一端或管道的另一端)关闭,则在您自己致电[close]
之前,不会将其视为关闭。因此,如果通道在另一端关闭,则将执行fileevent并且[eof]
将返回true(或读取操作将错误输出)。
我从未遇到过tcl检测到频道已关闭且未调用fileevent的情况。我不认为这是可能的。但是,有些情况下通道实际上已经死但未关闭(通常是由于网络错误或另一端的机器重新启动)。对于这种情况,您需要实现超时。但超时并不意味着频道已关闭。这只是意味着你不再确信通道另一侧的机器仍然存在。