Comandos de shell en C++

Iniciado por ericksav22, 16 Enero 2013, 00:29 AM

0 Miembros y 1 Visitante están viendo este tema.

ericksav22

Hola a todos, necesito ayuda con un programa que quiero hacer en C++ y es mediante comandos de terminal (en linux) C++ debe ir al compilador gcc y compilar programas ("gcc programa.c") y si no regresa ningún error en la compilación debe ejecutarlos e ingresarles datos, por ejemplo si yo hago un programa en C que sume 2 cantidades

#include <stdio.h>
int main(int argc, char *argv[])
{
int n1, n2;
printf("Ingresa 2 numeros:");
scanf("%d%d",&n1,&n2);
printf("La suma es: %d.\n",n1+n2);
return 0;
}


entonces C++ mediante popen o alguna funcion parecida debe compilar y ejecutar ese programa y ademas debe ingresarle los datos para que se puedan sumar, espero ser explícito. Yo pude hacer que compile y ejecute el programa pero lo único que no supe es como ingresarle datos :/ Alguna idea?

dooque

Hola!

"Creo" que entiendo tu pregunta jajaja!

El problema es que debiste ser un poco más específico ya que tengo preguntas sobre tu pregunta jaja.
La que más me inquieta en este momento es : ¿Tu programa en C++ sabe a priori que datos debe ingresarle al programa compilado y ejecutado echo en C, o tiene que "deducirlo" de alguna manera?

Salvando esa duda, lo que vos necesitas es manejar PIPEs (en castellano "tuberias"), que es una manera de comunicar procesos. Primero deberías leer algo de Comunicación Entre Procesos o IPC (http://en.wikipedia.org/wiki/Inter-process_communication).

Este es un link de como usar un pipe en C (en C++ es lo mismo): http://www.gnu.org/software/libc/manual/html_node/Creating-a-Pipe.html

Además, si no estoy muy oxidado con este tema, creo que la función popen() ya te crea un pipe de lectura o escritura (según vos le indiques) al nuevo proceso, pasate por la página del manual de la función (http://linux.die.net/man/3/popen) para estar más seguro.

Trata de leer y escribir algo de código, si no te funciona pasate por acá así le echamos un ojo entre todos, dale?

Suerte con eso!

Saludos.
Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.  -- Kernighan

ericksav22

Cita de: dooque en 16 Enero 2013, 02:52 AM
Hola!

"Creo" que entiendo tu pregunta jajaja!

El problema es que debiste ser un poco más específico ya que tengo preguntas sobre tu pregunta jaja.
La que más me inquieta en este momento es : ¿Tu programa en C++ sabe a priori que datos debe ingresarle al programa compilado y ejecutado echo en C, o tiene que "deducirlo" de alguna manera?

Salvando esa duda, lo que vos necesitas es manejar PIPEs (en castellano "tuberias"), que es una manera de comunicar procesos. Primero deberías leer algo de Comunicación Entre Procesos o IPC (http://en.wikipedia.org/wiki/Inter-process_communication).

Este es un link de como usar un pipe en C (en C++ es lo mismo): http://www.gnu.org/software/libc/manual/html_node/Creating-a-Pipe.html

Además, si no estoy muy oxidado con este tema, creo que la función popen() ya te crea un pipe de lectura o escritura (según vos le indiques) al nuevo proceso, pasate por la página del manual de la función (http://linux.die.net/man/3/popen) para estar más seguro.

Trata de leer y escribir algo de código, si no te funciona pasate por acá así le echamos un ojo entre todos, dale?

Suerte con eso!

Saludos.
Hola dooque, no las entradas ya deben de estar escritas, tal vez en algún archivo .in o no se pero ten por seguro que esas las escribe el usuario. Hablando de las pipes yo también llege a pensar que son lo que necesito y si he leido un poco de ellas aunque no les he entendido muy bien pero seguiré tratando, lo que me falta saber es cómo puedo ingresarle datos a un proceso ya creado, trataré de calar varios códigos y gracias por tu ayuda ;) Saludos.

Puntoinfinito

Pués con system("g++ programa.cpp -o programa"),  luego si da error ya avisara la respuesta del comando. En caso que compile bien, lo abres desde comandos linux "./" o que escriba la dirección directamente.

Para inserir datos, justo despues de poner "./" o la dirección donde se encuentra "/home/user/programa", insertas los datos a inserir, si són dos pues; "./programa 3 4". En este caso sumara 3 y 4.

Esto no se puede considerar como una respuesta 100% valida. Pero si ha de ser para Linux, pues sirve perfectamente...

Saludos!
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

dooque

No es un solución muy ortodoxa que digamos y tiene muchas limitaciones. Además si el programa toma los datos por la entrada estandar esta idea no funciona.

Saludos.
Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.  -- Kernighan

0xDani

@puntoinfinito, para eso esta execX().

Lo que deberias hacer es crear una pipe(), hacer un fork(), un dup2() de la salida y la entrada estandar a las pipes, luego un execX() (execve(), execl()...) del gcc/g++ y analizar la salida del programa, que puedes obtener leyendo la pipe de entrada del proceso padre. Si encuentras el string "error" por ejemplo, pues lanzas un mensaje de error.

Y luego para ejecutarlo pues lo mismo, execX().
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM