2011-07-04 1 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), в то время как если бы я использование execvp, espeak умещается правильно.

Таким образом, все, что нужно действительно Необходимо, чтобы этот сценарий был в состоянии запустить подпроцесс и убить его по требованию.

Есть ли другая библиотека, которая может сделать это правильно, например 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