Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Ejecutar Aplicacion Externa desde Perl

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Mar Nov 22, 2005 2:25 pm
astroluzz
Perlero Nuevo
Perlero Nuevo
Registrado: 22 Nov 2005
Mensajes: 3
Ejecutar Aplicacion Externa desde Perl Responder citando

hola mi problema es el siguiente. estoy haciendo un programa en perl, con GTK2 que es una libreria grafica para perl en Linux. el problema es que intento ejecutar otro programa desde mi programa en perl, con la funcion system de perl, pero al ejecutar esta instruccion, el programa se ejecuta y va bien, pero hasta que el programa que ejecuto con system desde perl, no termina, no devuelve el control a mi programa en perl. Como puedo hacer para que al ejecutar un programa desde perl con system o con otra funcion u otra forma, se ejecute el otro programa y se pueda seguir usando mi programa en perl??
Se puede hacer esto?
me he explicado correctamente??
muchas gracias por la ayuda de antemano.
un saludo
Mensaje Mar Nov 22, 2005 10:41 pm
AkonD
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Oct 2005
Mensajes: 50
Ubicación: España
Responder citando

Prueba de leer la documentación del programa que ejecutas. Mira si puede ser ejecutado en modo backround.
Mensaje Mie Nov 23, 2005 4:46 am
explorer39
Perlero Frecuente
Perlero Frecuente
Registrado: 23 Ago 2005
Mensajes: 126
Ubicación: Valladolid, España
Responder citando

Un system en realidad es un fork seguido de un exec.
Puedes hacer lo mismo para que tu programa continúe:
Código:
if ( $pid = fork ) {
    # Aquí estamos como proceso padre
    # ....
}
else {
    # Aquí estamos como proceso hijo
    # Comprobamos que realmente hemos podido crear un hijo
    die "No puedo crear un hijo: $!" unless defined $pid;

    exec("programa")    or die "No puedo hacer un exec: $!\n";
}

Primero hacemos un fork, que crea en el sistema dos procesos iguales. El padre puede realizar alguna tarea administrativa antes de salir del if, mientras que el proceso hijo, su única misión es realizar un exec a un nuevo programa, con lo que el hijo desaparece y es reemplazado por el nuevo.
Seguro que hay más alternativas, desde luego.
Más información sobre system, exec y fork.
Recomendable consultar las recetas 16.2 y siguientes del Perl Cookbook.
Solución rápida: Ir al faq8 donde está respondida tu pregunta.
Mensaje Mie Nov 23, 2005 5:24 am
astroluzz
Perlero Nuevo
Perlero Nuevo
Registrado: 22 Nov 2005
Mensajes: 3
Responder citando

muchas gracias por vuestras respuesta. acerca de lo del & creo qeu no se puede, el programa que intento ejecutar es perl, y me dice qeu el archivo no lo encuentra que no se puede ejecutar y cosas como esas, lo he probado de todas las formas uqe he podido.

acerca de lo del fork, voy a mirar y a probar a ver que tal me va, pero creo que eso es lo que estaba buscando o algo parecido por lo menos.

me ha sido de mucha ayuda, muchisimas gracias. lo pruebo y os digo como me fue.

Gracias
Mensaje Mie Nov 23, 2005 5:25 am
explorer39
Perlero Frecuente
Perlero Frecuente
Registrado: 23 Ago 2005
Mensajes: 126
Ubicación: Valladolid, España
Responder citando

Prueba:
Código:
     system("perl /camino/al/programa.pl &");
Mensaje Mie Nov 23, 2005 6:25 am
astroluzz
Perlero Nuevo
Perlero Nuevo
Registrado: 22 Nov 2005
Mensajes: 3
Responder citando

si que me ha funcionado esta bien, es lo perfecto, pero necesito una cosa mas. como puedo saber cuando a acabado el proceso que ejecuto con exec??

se puede saber o es imposible hacer eso??

ademas una cosa hago esto:


Código:
if ( $pid = fork ) {
       # Aquí estamos como proceso padre
       # ....

     }
     else {
        # Aquí estamos como proceso hijo
        # Comprobamos que realmente hemos podido crear un hijo
        die "No puedo crear un hijo: $!" unless defined $pid;
        exec("mplayer","-fs 2.mpv");
    }
cual es el pid de cada uno de los procesos?? cual es el pid del mplayer por ejemplo??

muchas gracias por adelantado.

un saludo y muchas gracias de nuevo
Mensaje Sab Nov 26, 2005 4:48 pm
explorer39
Perlero Frecuente
Perlero Frecuente
Registrado: 23 Ago 2005
Mensajes: 126
Ubicación: Valladolid, España
Responder citando

astroluzz escribió:
Si que me ha funcionado esta bien, es lo perfecto, pero necesito una cosa mas. como puedo saber cuando a acabado el proceso que ejecuto con exec??
Se puede saber o es imposible hacer eso??
A ver... suponemos que quieres que el programa perl sea completamente sustituído por el nuevo programa. Eso implica que hay que ejecutar un exec en vez de un system.
Desde luego para saber que el programa ha terminado nada más sencillo que ver que no existe el pid del programa que hemos lanzado.
En caso de utilizar un fork podríamos usar waitpid para esperar a que el hijo termine.
En ese caso, lo mejor sería incorporar al proceso padre lo siguiente:
astroluzz escribió:
ademas una cosa hago esto:
Código:
if ( $pid = fork ) {
    # Aquí estamos como proceso padre
    # ...
    # $pid es el pid del hijo. Esperamos a que termine
    waitpid($pid,0);
}
else {
    # Aquí estamos como proceso hijo
    # Comprobamos que realmente hemos podido crear un hijo
    die "No puedo crear un hijo: $!" unless defined $pid;
    exec("mplayer","-fs 2.mpv");
}
cual es el pid de cada uno de los procesos?? cual es el pid del mplayer por ejemplo??
Pues $pid. Ese valor se devuelve al proceso padre. La doc la tienes en fork.
Y no olvides de leer la pregunta correspondiente.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group