PDA

View Full Version : c++ system() linux


LimiT-MaTz
12-11-2005, 17:25
Ciao a tutti.
Sto realizzando (senza pochi problemi e grattacapi) un device + programma per gestire un display lcd per il mio router/ap/mailserver
Per quanto concerne la parte hardware ho risolto usando un pic delegandogli tutto il lavoro di 'gestione'. Ora tutto cio' che gli arriva sulla seriale lo visualizza(devo ancora provare).
Questo per quanto riguarda la ricezione. Per quanto riguarda l'invio invece c'è un'altra 'struttura' hw che mi passa una serie di byte con delle informazioni utili.
Nonostante la seriale mi pare sia fullduplex ho fatto in modo che i due flussi dato non passino mai contemporaneamente ma abbiano comunque un delay.
Ora sto cercando di scrivere 2 programmini distinti uno che si occupi della ricezione e uno dell'invio.

per quanto riguarda il send (pc=> display) mando una serie di 32 byte che vengono prima bufferizzati e poi inviati al display per eliminare ogni possibile problema di delay fisico del display.
Sul display mando tutta una serie di informazioni utili.
ad esempio utenti allacciati al router - banda occupata ecc ecc.
Si e' presentato un problema per determinare la banda occupata.
Per motivi di semplicita' (ovvero mia ignoranza) ho deciso di determinare la banda lorda attingendo informazioni dal fs /proc/dev/net.
l'idea e' quella di sommare i byte ricevuti + byte inviati aspettare 0,5 s risommare i byte ric + inv e a questo punto fare la differenza tra le due somme e dividere per 512
alla fine di questo processo ottengo i kbyte lordi ricevuti al sec.
grossomodo facendo 2 prove il sistema funziona (non necessito certo di una precisione al bit l'importante e' avere un'idea ragionevole della banda occupata).
Il processo sopra descritto viene compiuto da uno scriptino in Bash e quindi per essere utilizzato nel mio progettino in C++ necessito fare una chiamata int System(const char *)
che in caso vada a buon fine ritorna 0 else non dato a buon fine ($? = 1).

il problema ora e' quello di riuscire a 'catturare' il risultato della chiamata system, con risultato non intendo fallito/eseguito.

Per risolvere il problema pensavo di ,anziche inviare il risultato allo standard output , indirizzarlo verso un fiel temporaneo e poi andare a leggere questo aprendo uno stream in C.
La soluzione mi sembra un po laboriosa (a dire il vero lo e' anche il sistema utilizzato per trovare i kbyte/s).

Avete qualche consiglio?

Grazie
p.s: scusate l'ortografia ecc ecc ma sono veramente stanco

Ziosilvio
12-11-2005, 19:47
L'uso di un file temporaneo è sicuramente la strada più semplice, comune, e portabile.

E temo sia anche l'unica: ogni processo ha la sua zona di memoria dedicata, e passare dati direttamente da una zona all'altra credo non sia possibile.
Qui però non sono sicuro, e chiedo conferma.

Qu@ker
13-11-2005, 10:18
#include <stdio.h>

int main()
{
char buf[BUFSIZ+1] = {0};
FILE *read_fp = popen("ls -l", "r");
if (read_fp) {
int numFile = 0;
while (fgets(buf, sizeof buf, read_fp))
if (buf[0] == '-')
++numFile;
printf("Nella directory corrente ci sono %d file.\n",
numFile);
pclose(read_fp);
}

return 0;
}