2011-07-04 11 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(TCL)によって作成されたサブプロセスは、プロセスが死んだ場合に続けるように見えるので、私はexecvpを必要とする理由は、(私はGUIのうち、INGの」^Cことで、これを確認することができます)、一方、もし私がexecvp,espeakが正しく死ぬ。

このように、すべてのI は本当にこのスクリプトの必要性は、サブプロセスを開始し、要求に応じてそれを殺すことができるようにすることです。

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

関連する問題