-1

私は現在、コマンドラインツール(espeak)をTcl / Tkでラップしていますが、これまでにこれを理解しました。

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とする理由は、(Tcl)によって作成されたサブプロセスは、プロセスが終了execしても続行しているように見えるためです(これ^Cは、GUIから削除することで確認できます)が、を使用するexecvpと、espeak適切に終了します。

したがって、このスクリプトから本当に必要なのは、サブプロセスを開始してオンデマンドで強制終了できるようにすることだけです。

Expectのように、これを適切に実行できる別のライブラリはありますか?

4

1 に答える 1

2

Tclはexecvp内部で使用するので(実際、ソースを確認したばかりです)、違いは他の場所にあります。それは他の場所で信号になります。コマンド(および同じ基になるエンジンを使用する他のもの)によって作成されたサブプロセスexecでは、シグナルの大部分がデフォルトのシグナルハンドラーを使用するように強制されますが、デフォルト以外に設定されるシグナルはSIGPIPEのみであるため、他に何があるのでしょうか。起こっています。

とは言うものの、この種のものを扱うための決定的な拡張機能はTclXです。これにより、部分的に使用していたすべての低レベルのPOSIX機能にアクセスできます。(期待もそれを行うことができるかもしれません。)

于 2011-07-04T17:24:25.267 に答える