使用 fileevent 拖尾本地文件
Tailing a local file using fileevent
我正在尝试使用 fileevent
尾部文件(应该只有 Tcl 8.4 版本,所以我不能使用 chan
命令)。
% proc GetData {chan} {
set data [read $chan]
puts "[string length $data] $data"
if {[eof $chan]} {
fileevent $chan readable {}
}
}
%
%
%
% set fp [open "|tail -f /home/dinesh/input" r+]
file7
% fconfigure $fp
-blocking 1 -buffering full -buffersize 4096 -encoding utf-8 -eofchar {{} {}} -translation {auto lf}
% fconfigure $fp -blocking 0 -buffering line
%
%
%
%
% fileevent $fp readable [list GetData $fp]
%
我已经在另一个终端中使用 cat
命令更改了文件内容,但仍然没有调用 GetData
。
使用gets $fp line
,我可以获取修改后的内容,但为什么没有触发fileevent?
使用 fileevent
安排的回调仅在您 运行 事件循环时发生,并且 tclsh
默认情况下不会为您 运行 事件循环.试试看我的假设是否正确:
update
如果是,您需要将程序设计为由回调驱动工作。 运行事件循环的标准方式是这样的:
vwait forever
# Any global variable name would do, but “forever” has a nice feel
但这对您的交互式测试帮助不大。 (解决这个问题的一种方法是加载 Tk 包;默认情况下它会打开 运行 事件循环,因此您不需要显式地这样做。并给您 windows 来管理,所以它并非没有后果……)
我正在尝试使用 fileevent
尾部文件(应该只有 Tcl 8.4 版本,所以我不能使用 chan
命令)。
% proc GetData {chan} {
set data [read $chan]
puts "[string length $data] $data"
if {[eof $chan]} {
fileevent $chan readable {}
}
}
%
%
%
% set fp [open "|tail -f /home/dinesh/input" r+]
file7
% fconfigure $fp
-blocking 1 -buffering full -buffersize 4096 -encoding utf-8 -eofchar {{} {}} -translation {auto lf}
% fconfigure $fp -blocking 0 -buffering line
%
%
%
%
% fileevent $fp readable [list GetData $fp]
%
我已经在另一个终端中使用 cat
命令更改了文件内容,但仍然没有调用 GetData
。
使用gets $fp line
,我可以获取修改后的内容,但为什么没有触发fileevent?
使用 fileevent
安排的回调仅在您 运行 事件循环时发生,并且 tclsh
默认情况下不会为您 运行 事件循环.试试看我的假设是否正确:
update
如果是,您需要将程序设计为由回调驱动工作。 运行事件循环的标准方式是这样的:
vwait forever
# Any global variable name would do, but “forever” has a nice feel
但这对您的交互式测试帮助不大。 (解决这个问题的一种方法是加载 Tk 包;默认情况下它会打开 运行 事件循环,因此您不需要显式地这样做。并给您 windows 来管理,所以它并非没有后果……)