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