2011-07-04 70 views
-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)去,而如果我使用execvpespeak正確死亡。

因此,所有我真的需要出這個劇本的是能夠啓動一個子進程,並殺死它的需求。

是否有另一個庫可以正確執行此操作,如Expect?

回答

2

Tcl在內部使用execvp(真的;我剛剛查看了源代碼),所以區別在於別處。其他地方會有信號;由exec命令創建的子進程(以及其他使用相同底層引擎的東西)將使大多數信號被迫使用缺省信號處理程序,但由於它設置爲非缺省信號的唯一信號是SIGPIPE,我不知道還有什麼正在進行。

也就是說,與這類事情一起工作的最終延伸是TclX。這使您可以訪問部分使用的所有低級別POSIX功能。 (期望也可以做到。)

+0

對,你是--TclX有'execl'命令,這就夠了。我將不得不將它封裝起來以執行'execv'(爲什麼他們沒有TclX內建,因爲'execv'超出了我的範圍),但它有效。 [Cookie](http://www.celebritydietdoctor.com/wp-content/uploads/2009/08/the-cookie-monsters-change-in-diet.jpg)。 – new123456

相關問題