Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ericksav22 en 16 Enero 2013, 00:29 am



Título: Comandos de shell en C++
Publicado por: ericksav22 en 16 Enero 2013, 00:29 am
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

Código:
#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?


Título: Re: Comandos de shell en C++
Publicado por: 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 (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 (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 (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.


Título: Re: Comandos de shell en C++
Publicado por: ericksav22 en 16 Enero 2013, 09:03 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 (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 (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 (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.


Título: Re: Comandos de shell en C++
Publicado por: Puntoinfinito en 17 Enero 2013, 12:17 pm
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!


Título: Re: Comandos de shell en C++
Publicado por: dooque en 17 Enero 2013, 14:50 pm
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.


Título: Re: Comandos de shell en C++
Publicado por: 0xDani en 17 Enero 2013, 15:49 pm
@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().