我已经在Windows环境中使用Tcl的exec命令从Tcl程序中启动了iperf作为后台进程。但是,我想在将来的任意时间以编程方式从同一个Tcl程序中杀死iperf进程。我怎样才能做到最好?
这是我正在使用的代码
proc runtest { REF_WLAN_IPAddr run_time} {
exec c:\\iperf_new\\iperf -c $REF_WLAN_IPAddr -f m -w 2M -i 1 -t $run_time >& xx.txt &
# have some code after this
}
但是我看到iperf没有被杀死,所以控件没有转回TCL,我怎么能这样做?答案非常感谢 }
答案 0 :(得分:6)
exec
将返回子进程PID列表,
但是Tcl没有内置的kill命令;这些仅在扩展中提供。
所以你有两个主要选择:
获取TWAPI包http://twapi.magicsplat.com/并使用该包中的end_process
函数(请参阅http://twapi.magicsplat.com/process.html#end_process)
使用第二个exec并使用/ PID选项
运行windows命令taskkillexec [auto_execok taskkill] /PID $pid
答案 1 :(得分:1)
或者
exec {*}[auto_execok start] C:\\Windows\\System32\\taskkill.exe $pid
或
exec {*}[auto_execok start] C:\\Windows\\System32\\taskkill.exe /F /IM ProgramName.EXE /T
答案 2 :(得分:0)
这是我使用的骨架脚本:
package require Tclx
puts "main begins"
puts "Launch child script"
set childPid [exec tclsh child.tcl 0 &]
puts "Child PID: $childPid"
puts "Do something now..."
after 1000
puts "Now wait for child to finish"
lassign [wait $childPid] pid howEnded exitCode
puts "Process $pid ended with reason ($howEnded) and exit code ($exitCode)"
puts "main ends"
以下是一个示例运行:
$ tclsh main.tcl
main begins
Launch child script
Child PID: 25837
Do something now...
child runs for 16889 miliseconds
Now wait for child to finish
child ends
Process 25837 ended with reason (EXIT) and exit code (0)
main ends