-1
我目前正在包裝一個命令行工具(espeak
)用的Tcl/Tk,到目前爲止,我已經想通了這一點:模擬execvp - 有沒有更好的方法來做到這一點?
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?
對,你是--TclX有'execl'命令,這就夠了。我將不得不將它封裝起來以執行'execv'(爲什麼他們沒有TclX內建,因爲'execv'超出了我的範圍),但它有效。 [Cookie](http://www.celebritydietdoctor.com/wp-content/uploads/2009/08/the-cookie-monsters-change-in-diet.jpg)。 – new123456