Newsgroup: it.comp.java
Titolo: (LUNGO) Dubbi su Runtime.getRuntime(), exec() e waitFor()

Ciao a tutti, miei Java-Heroes !!! ^______^
Vi chiedo aiuto per un piccolo problema:
Ho un applicazione in C (non passate oltre !!! Non e' un OT !!!! ^____^) da riga
di comando che esegue delle elaborazioni (piuttosto lunghe) su un file di testo
e vuole in argomento una coppia di parametri interi. Siccome devo eseguire circa
un centinaio di volte questa applicazione, ogni volta con una coppia di
parametri diversi, avevo pensato di fare tutto in automatico realizzando un
piccolo programmino java in cui ho messo un ciclo sul valore dei due parametri.
I valori dei due parametri stanno in due array, userID_array[] e
numrequest_array[], cosicche' la coppia (userID_array[i], numrequest_array[i])
e' una coppia di parametri valida. All'interno di questo ciclo, come da FAQ, ho
scritto:
 try
  {
        String command = "app_C.exe file_di_testo.txt "+ userID_array[i] + " " +
numrequest_array[i];
        Runtime rt = Runtime.getRuntime();
        Process figlio = rt.exec(command); 
        int rc = figlio.waitFor();
	}
  catch (InterruptedException me)
       {
	  System.out.println("Ugh.");
              }
Ora, dalle FAQ e dalla documentazione delle API Java sembrava chiaro che
waitFor() blocca il thread chiamante (in questo caso il programmino java)
finche' il processo figlio non termina. In condizioni normali, l'applicazione
app_C.exe ci mette 15-20 min. per terminare, quindi non puo' essere che waitFor
ritorni immediatamente il valore che memorizzo in rc.
Eppure, eseguendo il programmino Java, si vedono aprirsi (e immediatamente
chiudersi) diverse finestre DOS (non le ho contate perche' apparivano e
sparivano troppo in fretta, ma secondo me dovrebbe essersene aperta una per ogni
iterazione del ciclo) SENZA che app_C.exe venga pero' mai eseguita.
Ho controllato bene che:
- il comando scritto nella stringa command sia stato scritto con la sintassi
giusta;
- che il file app_C.exe sia nella stessa directory della mia classe Java;
- che il file file_di_testo.txt sia anche lui nella stessa directory;
- che app_C.exe non dia errori (lanciandola da riga di comando con un comando
identico a quello scritto nella stringa command, l'applicazione funziona a
dovere);
Qualcuno saprebbe spiegarmi perche' non riesco ad ottenere il comportamento
voluto ? (ad ogni iterazione, viene lanciata app_C.exe con i correnti valori dei
suoi due parametri, il programma Java si blocca e attende che app_C.exe faccia
tutto quelo che deve fare, poi passa all'iterazione successiva con altri due
valori dei parametri)
Scusate per la lunghezza del post.... dovevo spiegarmi bene !!
Grazie un milione a chi e' arrivato a leggere fin qui e ancora di piu' a chi mi
rispondera' !!!!
Ciao !!! ^________^
--
 ... The Machman
 
 ---------------------------------
 "Questions are a burden to other, 
  answers a prison for oneself."   
 ---------------------------------
 
m.cu...@inwind.it

Su che sistema fai girare il tutto?
--
 ... The Machman
  ---------------------------------
 "Questions are a burden to other, 
  answers a prison for oneself."   
 ---------------------------------
 MESSAGGIO SUBLIMINALE: Voglio essere anch'io un Java-Hero !!!
 
m.cu...@inwind.it

Scusate per la lunghezza del post.... dovevo spiegarmi bene !!
Il codice pare corretto, quindi la cosa piu' probabile e' che app_C *non* venga 
in effetti eseguito. Ad esempio, e' in PATH? Prova ad usare il path assoluto. 
Su che sistema fai girare il tutto?
-- 
God is Real, unless declared Integer.
ObjectZone - 
http://space.tin.it/computer/csadun/

Non so, io proverei a mettere una stampa su stdout all'inizio
dell'applicazione C (per vedere che esca qualcosa)
Poi proverei a lanciare l'applicazione mediante una shell ("cmd /c ..."
su NT o magari "start ...")
Personalmente, non ho mai incontrato problemi di questo tipo, sorry ;-)
Ciao,
    Bruno.
--
Bruno Bossola, a Java Developer
Sent via Deja.com 
http://www.deja.com/
Before you buy.

ciclo di chiamate ad applicazioni esterne ? 
Be', ma nel tuo codice non avevi messo il path assoluto. :)
Intendevo proprio "c:\\miaapp\\app_C.exe" per minimizzare le possibilita' di 
errori collaterali.
Su win32, ad esempio, prova: 
 public class T {
  public static void main(String args[]) throws Exception {
      for (int i=0;i<10;i++) {
        String command = "notepad";
        System.out.println("Executing "+command);
        Process p = Runtime.getRuntime().exec(command); 
        p.waitFor();
      }
	}
 }
e ti si aprono magicamente 10 notepad... :)



Fa niente ....grazie lo stesso ^____^
Ciao !!!


	    command += userID[i] + " " + num_req[i];
mi servivano solo per scrivere in command la stringa "d:\miadir\app_C.exe
file_di_testo.txt   userID[i]   num_req[i]" !
L'ho anche stampato su stdout il contenuto di command e c'era scritto proprio
"d:\miadir\app_c.exe file_di_testo.txt   userID[i]   num_req[i]" ....
Comunque ho preso la tua classe T, l'ho compilata ed eseguita.
Effettivamente si aprono magicamente 10 notepad e non solo, l'i-simo notepad si
apre solo dopo aver chiuso l'(i-1)-simo, proprio come volevo io !!!
Ormai convinto dei tuoi poteri semi-divini, ho apportato quest'UNICA (giuro !!!)
modifica alla classe T:
String command = 
"d:\\miadir\\app_C.exe  file_di_testo.txt" + userID[i] + " " + num_req[i];
al posto di
String command = "notepad";
Poi ho compilato, eseguito e...
si comporta sempre allo stesso modo !!!  O___o
Si aprono 10 prompt uno dopo l'altro, dove l'i-simo prompt se ne frega del fatto
che l'(i-1)simo prompt e' rimasto aperto solo per un nientesimo di secondo senza
visualizzare nulla ....
Ho provato anche a mettere il nome DOS della directory miadir (che in effetti
avrebbe un nome lungo), ma non cambia nulla...ma perche' non funziona ???
Mah, forse sara' meglio lasciar perdere. In fondo sono riuscito ad ottenere
l'effetto voluto in C. Pero'...ma che strano !!!
Ciao e grazie !!! ^____^


"cmd /K mia_app.exe" invece di "mia_app.exe".
Ci provero' appena vado in facolta'...a casa non ho spazio per installare NT...
Ciao e grazie !!! ^_____^


nientesimo di secondo senza visualizzare nulla ....
Mh, com'e' fatta la tua applicazione? E sei sotto win32 o che?
Incuriosito, e incapace di lavorare seriamente dopo il party di ieri sera
;-), ho provato a compilare sotto win32 (VC++5sp3) 
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
void main(void) {
  std::cout << "test" << std::endl;
  Sleep(1000);
}
e non ho avuto problemi: i 10 processi mi si aprono uno dopo l'altro a
distanza di circa 1 secondo, come atteso. 
Puoi anche provare (NT) a usare cmd /K per vedere cosa succede, lanciando
"cmd /K mia_app.exe" invece di "mia_app.exe".
-- 


 ;-)
Mmm... questo, e il fatto che io ieri sera sia andato al pub a fumarmi la
pipa in santa pace, mi induce a pensare che, contrariamente alle credenze
popolari, anche i programmatori hanno una vita sociale! Incredibile! :)
Ciao,
 Stefano
----------
"X WindowSSS, teSSSoro mio... lo odieremo per SSSempre"
Bill Gollum
----------

popolari, anche i programmatori hanno una vita sociale! Incredibile! :)
Wayyyyyyyy too much. :)
Soprattutto quando "lavorare seriamente" significa fare il piano di attivita' 
per il prossimo mese :( per cinque programmatori scavezzacolli (che, ieri sera, 
erano con me ;-) 
Molto, molto piu' divertente un problema in Java e C.
