PDA

View Full Version : [PHP] [C] Problemi di "comunicazione" tra i due linguaggi


deggial
06-03-2007, 09:44
Ciao a tutti, ho un problema che non so bene identificare, forse ha a che fare con la funzione system di PHP.

Il riassunto del discorso è questo: ho un programma fatto in C, se lo eseguo manualmente da prompt funziona bene, se lo richiamo tramite funzione system di PHP funziona male.
Vediamo in dettaglio:

Programma C (compilato con mingw):
Prende un file binario in formato strano, e ne estrae delle informazioni. Il risultato è un file di testo tipo questo:

2007-02-11,09:17:22,0,1,7,50,280,42,39,0
2007-02-11,09:17:21,0,1,7,49,273,4022,37,0
2007-02-11,09:16:40,0,1,9,87,672,666,162,0
2007-02-11,09:16:33,0,1,9,79,714,65535,157,0

Particolare importanza ha la data, come vi spiegherò dopo.

Se lo lancio da prompt di dos funziona bene, se creo un .bat e lancio il bat funziona bene nello stesso modo.
Il problema si ha se provo a lanciarlo da PHP (PHP 5.2.0, Apache 2.2.3).

Lo lancio sia in questo modo:

$sis1= system ("C:\\EXE\\estrai_dati.exe file_da_estrarre");

// file_da_estrarre è appunto il file binario da cui estrarre le info

che in questo modo:

$sis1= system ("C:\\EXE\\estrai.bat");

con i file estrai.bat che altro non è che

C:\EXE\estrai_dati.exe file_da_estrarre

In entrambi i casi il risultato è il seguente:

2007-02-11",09:17:22,0,1,7,50,280,42,39,0
2007-02-11",09:17:21,0,1,7,49,273,4022,37,0
2007-02-11",09:16:40,0,1,9,87,672,666,162,0
2007-02-11",09:16:33,0,1,9,79,714,65535,157,0

Notate il doppio apice che segue la data.

Per completezza, vi posso dire il programma C non estrae la data dal contenuto del file, ma dal suo nome.
In realtà il nome del file_da_estrarre è una sequenza di 10 cifre, che identificano un timestamp unix (cioè il numero di secondi passato dalla mezzanotte del 1 gennaio 1970).
Ad esempio, il file si può chiamare 1171181844, che corrisponde al 2007-11-02 alle 09:17:24.
Io da lì estraggo anno mese e giorno sotto forma di interi (con una *gmtime), converto in char (con una itoa), aggiungo uno "0" davanti ai mesi e giorni con una sola cifra e formo la stringa AAAA-MM-GG (perchè mi serve così).

Come detto, finchè lo lancio direttamente funziona, se lo lancio tramite php non funziona.

Qualcuno ha idea di cosa può essere?

Grazie a tutti, e scusate se mi sono dilungato, ma spero almeno di essere stato chiaro.

andbin
06-03-2007, 10:35
Qualcuno ha idea di cosa può essere?

Grazie a tutti, e scusate se mi sono dilungato, ma spero almeno di essere stato chiaro.Sì, sei stato abbastanza chiaro. L'unica cosa che non ho capito è: il programma in C mette le informazioni estratte su un file o le manda sullo standard-output?? È strano comunque quel apice doppio ...

Come suggerimento: potresti usare strftime per formattare la parte data-ora.

strftime (buf, sizeof (buf), "%Y-%m-%d,%H:%M:%S", gmtime (&t));Con questa stringa di formato ottieni nel buffer appunto una stringa del tipo:
2007-03-06,10:31:36

deggial
06-03-2007, 10:47
Sì, sei stato abbastanza chiaro. L'unica cosa che non ho capito è: il programma in C mette le informazioni estratte su un file o le manda sullo standard-output?? È strano comunque quel apice doppio ...

Come suggerimento: potresti usare strftime per formattare la parte data-ora.

strftime (buf, sizeof (buf), "%Y-%m-%d,%H:%M:%S", gmtime (&t));Con questa stringa di formato ottieni nel buffer appunto una stringa del tipo:
2007-03-06,10:31:36

per lo strftime, non ci avevo fatto caso, in effetti mi evita di formattare a mano.
il programma C scrive su un file di testo.

cmq un attimo ho provato a stampare la data carattere per carattere anzichè come stringa, e ho risolto il problema.
Quindi immagino che il problema sia nella gestione della memoria del mio prog C, ora lo riguardo bene...
cmq la soluzione trovata è poco elegante e non mi aiuta a capire il problema, quindi accetto volentieri altri aiuti e consigli...