これは、パイプラインを開いてバックグラウンドで ping を実行するための非常に単純なコードです。これを行うには、「ファイル名」の最初の文字を にします。「ファイル名」open
の|
残りの部分は、コマンド ライン引数の Tcl リストとして解釈されますexec
。
proc doPing {host} {
# These are the right sort of arguments to ping for OSX.
set f [open "|ping -c 1 -t 5 $host"]
fconfigure $f -blocking 0
fileevent $f readable "doRead $host $f"
}
proc doRead {host f} {
global replies
if {[gets $f line] >= 0} {
if {[regexp "Reply from $host" $result]} {
# Switch to drain mode so this pipe will get cleaned up
fileevent $f readable "doDrain $f"
lappend replies($host) 1
incr replies(*)
}
} elseif {[eof $f]} {
# Pipe closed, search term not present
lappend replies($host) 0
incr replies(*)
close $f
}
}
# Just reads and forgets lines until EOF
proc doDrain {f} {
gets $f
if {[eof $f]} {close $f}
}
イベント ループも実行する必要があります。これは些細なこと (Tk を使用している) かもしれませんし、明示的 ( vwait
) である必要があるかもしれませんが、上記に統合することはできません。しかし、巧妙なトリックを使用して、すべての結果を収集するのに十分な時間イベント ループを実行できます。
set hosts 172.35.122.18
set replies(*)
foreach host $hosts {
for {set i 0} {$i < 20} {incr i} {
doPing $host
incr expectedCount
}
}
while {$replies(*) < $expectedCount} {
vwait replies(*)
}
次に、replies
配列の内容を見て、何が起こったかの概要を取得します。