Tcl 模仿execvp-有更好的方法吗?

Tcl 模仿execvp-有更好的方法吗?,tcl,execvp,Tcl,Execvp,我目前正在用Tcl/Tk包装一个命令行工具espeak,到目前为止我已经解决了这个问题: 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} { e

我目前正在用Tcl/Tk包装一个命令行工具espeak,到目前为止我已经解决了这个问题:

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而拼凑的一个扩展:

我之所以需要execvp,是因为exec Tcl创建的子进程在进程终止时似乎会继续运行,我可以通过退出GUI来确认这一点,而如果我使用execvp,espeak将正确终止

因此,这个脚本真正需要的就是能够启动一个子进程并根据需要终止它

是否有其他库可以像Expect那样正确地执行此操作?

Tcl确实在内部使用execvp;我刚刚检查了来源,所以区别在别处。其他地方将处于信号状态;由exec命令创建的子进程以及使用相同底层引擎的其他东西将强制使用默认信号处理程序来处理大多数信号,但是由于它设置为非默认的唯一信号是SIGPIPE,我想知道还有什么其他的情况

也就是说,处理这类事情的最终扩展是。这使您能够访问部分使用的所有低级POSIX功能。Expect也可以做到这一点。

没错-TclX有execl命令,这就足够了。我将不得不包装它来执行execv为什么他们没有针对execv的TclX内置是我无法理解的,但它是有效的。为你。
#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;
}