• Publicidad

Ejecutar Aplicacion Externa desde Perl

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Ejecutar Aplicacion Externa desde Perl

Notapor astroluzz » 2005-11-22 15:25 @684

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
astroluzz
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2005-11-22 15:24 @683

Publicidad

Notapor AkonD » 2005-11-22 23:41 @028

Prueba de leer la documentación del programa que ejecutas. Mira si puede ser ejecutado en modo backround.
AkonD
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2005-10-06 06:36 @316
Ubicación: España

Notapor explorer39 » 2005-11-23 05:46 @282

Un system en realidad es un fork seguido de un exec.
Puedes hacer lo mismo para que tu programa continúe:
Código: Seleccionar todo
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.
explorer39
 

Notapor astroluzz » 2005-11-23 06:24 @308

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
astroluzz
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2005-11-22 15:24 @683

Notapor explorer39 » 2005-11-23 06:25 @309

Prueba:
Código: Seleccionar todo
     system("perl /camino/al/programa.pl &");
explorer39
 

Notapor astroluzz » 2005-11-23 07:25 @350

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: Seleccionar todo
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
astroluzz
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2005-11-22 15:24 @683

Notapor explorer39 » 2005-11-26 17:48 @783

astroluzz escribiste: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 escribiste:ademas una cosa hago esto:
Código: Seleccionar todo
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.
explorer39
 


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados