PDA

View Full Version : [C] stampare su STDOUT


trunks81
07-03-2005, 15:16
Allora ho un programmino di log che deve leggere da una pipe e stampare il contenuto a schermo.

questo è il codice:

int main () {
int fd,letti;
char buff[80];
while((fd=open("/tmp/pipe.out",O_RDONLY)) == -1){
sleep(1);
}
while(1)
{
IFERROR(letti=read(fd,buff,80),"Leggendo da pipe");
IFERROR(write(STDOUT,buff,letti), "errore in scrittura su stdout");
}
return 0;
}



il programma fa tutto perfettamente, ma mi si chiede che ogni volta che ci siano dei dati disponibili sulla pipe,deve stampare sul proprio stdout la data e l'ora corrente.

Quello che non capisco è: come faccio a fargli stampare la data e l'ora corrente SOLO QUANDO CI SONO DATI DISPONIBILI SULLA PIPE???

vi ringrazio.
ciao!

cionci
07-03-2005, 16:09
Se ho capito bene quello che chiedi, credo che basti controllare se letti è maggiore di zero...

trunks81
07-03-2005, 16:28
Originariamente inviato da cionci
Se ho capito bene quello che chiedi, credo che basti controllare se letti è maggiore di zero...

cosa devo cambiare nel codice?

ilsensine
07-03-2005, 16:30
La read è di default bloccante e _ovviamente_ quando ritorna ci sono (o meglio c'erano fino a pochi us fa) dei dati disponibili. Se ti si chiede di vedere se ci sono dati, _senza_ prelevarli dal pipe, utilizza una poll.

trunks81
07-03-2005, 17:30
io devo solamente stampare la data e l'ora corrente ogni volta che mi arriva qualcosa dalla pipe.

?????

cionci
07-03-2005, 17:36
Non avevo pensato al fatto che la read è bloccante...in effetti basta stampare la data ogni volta che esci dalla read...

trunks81
07-03-2005, 17:54
Originariamente inviato da cionci
Non avevo pensato al fatto che la read è bloccante...in effetti basta stampare la data ogni volta che esci dalla read...
non mi funziona...
se io metto:

int main () {
int fd,letti;
char buff[80];
while((fd=open("/tmp/pipe.out",O_RDONLY)) == -1){
sleep(1);
}
while(1)
{
IFERROR(letti=read(fd,buff,80),"Leggendo da pipe");
IFERROR(write(STDOUT,buff,letti), "errore in scrittura su stdout");
}
WRITELN("CIAO"); //lo faccio solo per prova
return 0;
}


non mi scrive niente....

:muro:

cionci
07-03-2005, 18:18
Lo devi mettere dopo la read...ma che roba è writeln ?

trunks81
07-03-2005, 18:23
il WRITELN lo uso per le stampe di prova.
Cmq se lo metto dopo la read, appena finiscono veramente i dati da leggere, mi va in ciclo infinito.


scusate l'ignoranza....ma di C non ne capisco prorpio.

cionci
07-03-2005, 18:50
Allora metti if(letti >0) WRITELN("CIAO");

trunks81
07-03-2005, 19:02
Originariamente inviato da cionci
Allora metti if(letti >0) WRITELN("CIAO");


non so perchè...ma mi continua ad andare in ciclo infinito....

cionci
07-03-2005, 19:04
Allora credo che ci sia qualche altra motivazione...una modifica del genre non può compromettere il corretto funzionamento di un programma...

trunks81
07-03-2005, 19:17
Originariamente inviato da cionci
Allora credo che ci sia qualche altra motivazione...una modifica del genre non può compromettere il corretto funzionamento di un programma...

cosa posso provare a cambiare??

VegetaSSJ5
07-03-2005, 21:16
trunks immagino che WRITELN e IFERROR siano macro dichiarate da te giusto??

trunks81
07-03-2005, 21:45
Originariamente inviato da VegetaSSJ5
trunks immagino che WRITELN e IFERROR siano macro dichiarate da te giusto??

si,sono macro di sistema.