我目前正在espeak
用 Tcl/Tk 包装一个命令行工具 ( ),到目前为止我已经弄清楚了:
load ./extensions/system.so
package require Tk
package require Tclx
set chid 0
proc kill {id} {
exec kill -9 $id
}
proc speak {} {
global chid
set chid [fork]
if {$chid == 0} {
execvp espeak [.text get 1.0 end]
}
}
proc silent {} {
global chid
kill $chid
}
system.so 是我一起破解以便能够使用的扩展execvp
:
#include <tcl.h>
#include <tclExtend.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
static int
execvp_command(ClientData cdata, Tcl_Interp *interp, int argc, const char* argv[])
{
if (argc == 1)
{
interp->result = "execvp command ?args ...?";
return TCL_ERROR;
}
execvp(argv[1], argv + 1);
return TCL_OK;
}
int System_Init(Tcl_Interp* interp)
{
if (Tcl_InitStubs(interp, "8.1", 0) == NULL)
return TCL_ERROR;
Tcl_CreateCommand(interp, "execvp", execvp_command, NULL, NULL);
Tcl_PkgProvide(interp, "system", "1.0");
return TCL_OK;
}
我需要的原因execvp
是,由exec
(Tcl) 创建的子进程似乎在进程终止时继续运行(我可以^C
通过退出 GUI 来确认这一点),而如果我使用execvp
,则espeak
正常终止。
因此,我真正需要的只是能够启动一个子进程并按需终止它。
是否有另一个库可以正确执行此操作,例如 Expect?