2011-07-04 3 views
-1

나는 현재는 Tcl/Tk를 사용하여 명령 줄 도구 (espeak)을 포장하고있어, 나는 지금까지이 알아 낸 :에뮬레이트 execvp - 더 나은 방법이 있나요?

system.so 내가 함께 해킹 확장 사용 할 수있다
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처럼 제대로 수행 할 수있는 다른 라이브러리가 있습니까?

답변

2

Tcl은 execvp을 내부적으로 사용합니다 (실제로는 소스를 확인한 것입니다). 그래서 차이점이 다른 곳에 있습니다. 다른 곳에서는 신호가있을 것입니다. exec 명령 (및 동일한 기본 엔진을 사용하는 다른 것들)에 의해 생성 된 서브 프로세스는 대부분의 신호가 기본 신호 처리기를 사용해야하지만, 기본값이 아닌 신호로 설정되는 유일한 신호는 SIGPIPE이므로 다른 것 진행되고있다.

즉, 이런 종류의 작업에 대한 최종 확장은 TclX입니다. 이렇게하면 부분적으로 사용하고있는 모든 저수준 POSIX 기능에 액세스 할 수 있습니다. (기대할 수도 있습니다.)

+0

맞습니다. - TclX에는'execl' 명령 만 있으면 충분합니다. 나는'execv'를하기 위해 그것을 포장해야 할 것이다. (왜 그들이'execv'에 TclX를 내장하지 않았는가?)하지만 작동한다. [Cookie] (http://www.celebritydietdoctor.com/wp-content/uploads/2009/08/the-cookie-monsters-change-in-diet.jpg)를 참조하십시오. – new123456