Comunicar un shell script con un programa en c

BRaDoLH

Vereis nos han mandado un ejercicio en clase en el cual tenemos que realizar un menú con dialog y posteriormente comunicar este con un programa en c.

Sería algo así como

MENÚ
----- Instalar
----- Jugar
----- Cargar juego

al seleccionar instalar , éste programa que esta en sh tendria que llamar a un programa c y luego el programa en c cuando acabase volvería a llamar al menú.

De momento lo he echo de manera cutre poniendo un exec (path/nombre_archivo) en el shell y un system(path/nombre_archivo) en el programa.c pero no lo veo muy claro...

He leido algo sobre pipes(tuberias) pero no lo acabo de entender..

Alguna sugerencia para hacerlo?

maRc

Pues eso, con tuberías.

Las tuberías son como ficheros temporales, en los que puedes leer/escribir a la espera de que otro proceso escriba/lea de él, que sirven para intercomunicar procesos.

Puedes crear la tubería en el script, lanzar el programa con la salida redirigida a la tubería y leerla. El programa, cuando vaya a acabar, que escriba algo en la tubería (si todo ha ido bien, "ok" por ejemplo). En este momento es cuando el script prosigue su ejecución, y podrás hacer una cosa u otra dependiendo lo que haya escrito el programa.

LOc0

Creo que para lo que quieres hacer no necesitas tuberías (a no ser que los programas en C tengan que mandarle información al script (y viceversa) durante la ejecución).

No sé cómo funciona exactamente el comando dialog, pero mírate la documentación para meter el menú dentro de un bucle y que te salga hasta que pulses la opción de salir.

Salu2 ;)

Y

A ver, lo que quieres hacer es bastante fácil. No me voy a meter en profundidad, ya que el código que tienes que hacer es realmente sencillo, solo te voy a facilitar la parte de llamar programa en C y luego, una vez el programa haya terminado, vuelva a lanzar el menu.

Bueno, para ejecutar un programa desde shell script (supongo que es en bash/sh), hay dos maneras:

#!/bin/bash
exec programa parámetros

o sin usar el comando exec

#!/bin/bash
programa parámetros

Como buen shell script que se precie, todo programa (al menos en sistemas *nix) tiende a lanzar una salida al terminar, siendo 0 o 1 si ha terminado correctamente o con errores.

Esto nos permite aprovecharlo para realizar otras operaciones.

Por ejemplo, si queremos que un programa se ejecute cuando el primero ha terminado con errores, haremos:

programa1 parámetros || programa2 parámetros

programa2 se ejecutará si programa1 no finaliza correctamente.

y si queremos que se ejecute algo, cuando el primer programa ha terminado correctamente, haremos:

programa1 parámetros && programa2 parámetros

De esta manera, programa2 se ejecutará cuando programa1 termine.

La ventaja de bash es que trata sus propios elementos como si procesos fueran. Por ejemplo, si hicieramos una función menú, sería algo parecido a esto:

menu () {
echo "Elije opción"
echo "1. Instalar"
echo "2. Jugar"
echo "..."
echo "lo que sea"
}

Al seleccionar una opción, se ejecutaría el programa deseado de la siguiente manera:

#!/bin/bash
...
#también puedes usar exec si te resulta más cómodo para interpretarlo

programa1 parámetros && menu || menu

De esta manera, tanto si programa1 termine bien o termine con errores, siempre volverá a aparecer el menú.

Saludos

BRaDoLH

Grácias a los tres por las respuestas.

Me miraré un poco más lo de las tuberias asi lo acabo de cuajar..

y #3 grácias por la amplia explicación pero hay un pequeño problema en eso que dices, según tengo entendido cuando haces un exec , éste mismo programa que lo realiza , muere y por lo tanto no podría llamar a la función menú no? bueno igualmente lo pruebo. thx

Salu2

Y

me confundí, exec es para ejecutar ficheros (programar en varios lenguajes es lo que tiene, que al final te haces un lio). Hazlo sin el exec y te funcionará, garantizado.

Saludos

Usuarios habituales