Newsgroup: it.comp.lang.c
Titolo: Lancio di applicazioni java...

Premetto che sono uno sviluppatore java e un ex sviluppatore C (la mia 
ultima esperienza con C risale a 4 anni fa). Vorrei un consiglio su come 
realizzare in C/C++ un lanciatore di una applicazione java. Il 
lanciatore deve catturare lo standard output ed error dell'applicazione 
java redirezionandolo su file e deve ottenere un valore di ritorno o 
comunque deve in qualche modo capire se l'applicazione e' morta bene o 
male. Il lanciatore deve andare su tutte le piattaforme ricompilandolo. 
Grazie
GC

:

Per lanciare un qualsiasi programma non ci sono problemi:
#include <stdlib.h>
system("stringa che ti permette di lanciare il programma");
La stringa ovviamente la formatti a piacere con una sprintf() prima di
chiamare la system, cosi' puoi avere una flessibilita' maggiore.
Hai un piccolo problema a catturarne l'output, perche' il C non te lo
permette direttamente (la system ti ritorna solo il risultato del
comando).
Puoi pero' redirigere lo stdout del programma lanciato in un file e
poi leggere il file (cosa penso disponibiel ovunque con la stessa
sintassi).
system ("java coso.class >> file.txt");
E poi con le funzioni standard (fopen, fgets, fclose) procedi a
leggerti tutto il file. Ricordandoti dopo ogni chiamata di svuotare
tutto il file.
Qualcuno potrebbe dirti di usare direttamente:
system ("java coso.class > file.txt");
Questo funziona quasi sempre, ma e' possibile che in alcuni casi non
te lo permetta se il file esiste gia' (non so esattamente da cosa
dipenda, parrebbe una configurazione della bash... a me capita usando
alcune macchine con solaris installato per es.), mentre puoi sempre
appendere (spazio permettendo) e puoi cancellare (permessi e owner del
file permettendo).
Se tu lavorassi solo sotto Unix potresti usare la funzione popen()
invece, che fa' automaticamente tutto questo.
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 ha scritto nel messaggio
news:3CF6522E...@libero.it...

Vedi un po' queste funzioni:
-- Sicuramente con system, exec ecc puoi mandare in esecuzione un altro
    programma.
-- Con wait, ecc puoi riceverne lo stato in uscita.
-- Redirezionare stdout e stderr puo' essere fatto con:
        > o >> per stdout (>> effettua l'append, > crea un nuovo file
(fallisce se gia' esiste))
        2>  per stderr.
    direttamente su linea di comando (funziona per Windows e *NIX)
-- Potresti (non so se valga su tutte le piattaforme) reindirizzare stderr e
stdout
    su PIPE e quindi ricevere direttamente i risultati sul lanciatore senza
creare
    "fastidiosi" file di appoggio.
Non sono del tutto sicuro che exec (e famiglia) e wait (e famiglia) siano su
tutte le piattaforme (sicuramente si su unix).
System c'e' dappertutto (e' stdlib), ma mi sembra di ricordare che abbia
qualche
controindicazione (non esce sugli interrupt?).
                                                          Andrea Z.


Grazie per la pronta risposta. Avevo pensato di usare un batch file per
lanciare l'applicazione java e di catturare l'output in modo tale da
verificare la presenza di una stringa chiave al termine
dell'applicazione. Se la stringa chiave e' presente al termine
dell'applicazione significa che il programma e' terminato normalmente
altrimenti ci sono stati dei problemi e devo salvare il file con lo
standard output. Esiste un sistema alternativo al popen che funzioni su
tutte le piattaforme per ottenere lo standard output di una applicazione
lanciata con system sotto forma di stream? A questo punto per me sarebbe
sufficiente leggere questo stream cercando la chiave e reindirizzarlo su
file.....
GC

Il launcher di Eclipse č scritto in C e lo trovi nel file 
launchersrc.zip in una distribuzione di Eclipse.