Mi spiego meglio:
dovrei riuscire a creare un programma che mi compili un altro programma.
Ho provato semplicemnete con una exec che mi esegue gcc ma mi si blocca tutto.
Qualcuno ha un'altra idea?
Mi spiego meglio:
dovrei riuscire a creare un programma che mi compili un altro programma.
Ho provato semplicemnete con una exec che mi esegue gcc ma mi si blocca tutto.
Qualcuno ha un'altra idea?
Fornisci ulteriori informazioni tipo il sistema operativo ed il programma da compilare (è un semplice sorgente C o un progetto?).
"Se riesci a passare un pomeriggio assolutamente inutile in modo assolutamente inutile, hai imparato a vivere."
innanzitutto grazie per la risposta.
Sono su linux...per la precisione su ubuntu 8.04,mentre il programma è un semplice sorgente c.
In pratica sto lavorando su un client che invia al server un file e il server dovrà compilarlo.Non ho problemi sull'invio e il resto ma il server, al momento, non riesce a compilare il programma.
facci vedere la chiamata ad exec , fai un fork o passi direttamente il controllo ?
Io comunque chiamere make.
ciao
sergio
int i=fork();
if (i = 0)
execl("gcc","prova.c",NULL);
immaginavo che qualcosa di così semplice andasse bene.Ma evidentemente non è che così![]()
codice:if(i == 0)
Amaro C++, il gusto pieno dell'undefined behavior.
XD....ops
Scusate
Ma comunque non va![]()
Originariamente inviato da After
int i=fork();
if (i = 0)
execl("gcc","prova.c",NULL);
immaginavo che qualcosa di così semplice andasse bene.Ma evidentemente non è che così
Codice PHP:
int i=fork();
if (i == 0)
execl("gcc","./prova.c",NULL);
scusami per la risposta, ero un po' fulminato, prova questo codice
così ti dovrebbe funzionare, è come se chiamassicodice:#include <stdio.h> int main () { int i=fork(); if (i == 0) { printf( "Sono nel child e chiamo gcc\n" ); execl("/usr/bin/gcc", "-o" , "prova", "prova.c", NULL); printf( "se sono qui c'è un errore\n" ); } else printf( "Sono nel parent\n" ); return ( 0 ); }
gcc -o prova prova.c
generando l'eseguibile prova dal sorgente prova.c
La execl vuole un path completo.
Tiene però presente che è meglio se usi la popen che ti apre un pipe, in questa maniera puoi avere l'output della chiamata.
ciao
sergio
Originariamente inviato da mondobimbi
scusami per la risposta, ero un po' fulminato, prova questo codice
così ti dovrebbe funzionare, è come se chiamassicodice:#include <stdio.h> int main () { int i=fork(); if (i == 0) { printf( "Sono nel child e chiamo gcc\n" ); execl("/usr/bin/gcc", "-o" , "prova", "prova.c", NULL); printf( "se sono qui c'è un errore\n" ); } else printf( "Sono nel parent\n" ); return ( 0 ); }
gcc -o prova prova.c
generando l'eseguibile prova dal sorgente prova.c
La execl vuole un path completo.
Tiene però presente che è meglio se usi la popen che ti apre un pipe, in questa maniera puoi avere l'output della chiamata.
ciao
sergio
Ecco appunto...con la exec sono riuscito a risolvere,ma non riesco a prendere il risultato dell'esecuzione.
Con popen dovrei risolvere?
edit: Mi spiego meglio
Questo è il codice con il quale avevo risolto il problema,ma ora dovrei prendere il risultato dell'esecuzione di a.out.Come faccio?Codice PHP:
if(pid==0)
{
execlp("gcc","gcc","prova3.c",NULL);
exit(0);
}
else
{
wait(NULL);
execlp("./a.out","./a.out",NULL);
exit(0);
}