나는 현재는 Tcl/Tk를 사용하여 명령 줄 도구 (espeak
)을 포장하고있어, 나는 지금까지이 알아 낸 :에뮬레이트 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
}
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;
}
경우 반면에 나는 exec
(티클)에 의해 생성 된 서브 프로세스는 프로세스가 (필자는 GUI에서 보내고 '^C
하여 확인할 수 있습니다) 죽을 때 계속하는 것 때문에 execvp
이 필요한 이유는, I execvp
,을 사용하십시오.제대로 죽습니다.
따라서 모든 은입니다.이 스크립트에서 필요한 것은 하위 프로세스를 시작하고 필요에 따라 종료 할 수있게하는 것입니다.
Expect처럼 제대로 수행 할 수있는 다른 라이브러리가 있습니까?
맞습니다. - TclX에는'execl' 명령 만 있으면 충분합니다. 나는'execv'를하기 위해 그것을 포장해야 할 것이다. (왜 그들이'execv'에 TclX를 내장하지 않았는가?)하지만 작동한다. [Cookie] (http://www.celebritydietdoctor.com/wp-content/uploads/2009/08/the-cookie-monsters-change-in-diet.jpg)를 참조하십시오. – new123456