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!
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.
?????
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:
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.
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....
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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.