Newsgroup: it.comp.programmare
Titolo: Redirezione dell'output

Salve a tutti,
ho scritto una funzione in C che gira su di un sistema Linux.Questa
funzioncina non fa altro che fare uno specifico log all'interno di un
file.A causa di un problema con i puntatori,il log sul file non posso
eseguirlo tramite la funzione write(fd,*buffer,*len),ma sono costretto
a :
1)chiudere il descrittore dello stdout:close(1);
2)duplicare lo stdout sul descrittore che sto utilizzando:dup2(filelog,
1);
3)scrivere i log tramite print(".....",...);
Fin qui tutto bene.
Il problema arriva alla fine,quando devo rimettere le cose come prima
e rimettere lo stdout al suo postoQualcuno può darmi una mano?
Grazie
Teo

BeBox ha scritto:

Brrr.... che roba brutta!
Vediamo se invece non sia possibile risolvere quel problema coi 
puntatori e rendere la scrittura sul file di log un po' piu' decente.
Innanzitutto, visto che il log esce sullo stdout, perche' non lanci 
semplicemente il tuo programma con
programma >> logfile
invece di fargli chiudere e riaprire i descrittori di sistema?
Se questa via non fosse possibile, perche' non apri normalmente il tuo 
file di log dall'interno del programma?
filelog = open("logfile", O_WRONLY|O_APPEND);

 filelog = open("logfile", O_WRONLY|O_APPEND);
Ok.Questa era la cosa che facevo prima ma il fatto è che per oscuri
(almeno a me) motivi la scrittura sul file aperto in questo modo non
sempre funziona.
In particolare ho un puntatore ad un buffer di memoria che non ne
vuole sapere di essere scritto come dovrebbe.So che non è il
massimo,ma con la redirezione dell'output mi funziona,con la scrittura
su file normale no

 su file normale no
Dovresti fornirmi maggiori informazioni.
Comincia con lo spiegare bene che cosa intendi quando lamenti 
malfunzionamenti, e se e' proprio un problema alla system call write, 
prova a capire che codice di errore ti restituisce e a che errore 
corrisponde.

 corrisponde.
Al momento non ho il codice sotto mano ma lo posso postare domani.
Grazie
Matteo

Cioè?Scusa la mia ignoranza ma non ho capito CR e LF
CR = carriage return (valore ASCII 13)
LF = line feed (valore ASCII 10)
La coppia CR+LF viene usata nei sistemi DOS/Windows come terminatore
di riga per i file di testo. Nei sistemi Unix-like, viene usato solo
il LF.

 il LF.
Chiaro
Grazie

 			}
Teoricamente la write è corretta.
Il descrittore filelog come lo hai valorizzato?
Ricordati che sizeof(char) è uguale a 1 su tutte le piattaforme.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

>
Se il codice è quello qui sopra, il motivo è che manca un &
prova con
write(filelog,&packet[i],sizeof(char))
Altrimenti scrive i byte che si trovano alle posizioni 0-255 della 
memoria dell'applicazione.
LP


il filelog viene passato come parametro dopo aver fatto una
logfile=open("/var/tmp/sf.log",O_WRONLY|O_CREAT);
E' un parametro globale per tutte le funzioni.
Dal main:
log_com(fd,0,logfile,packet,len);
fd->descrittore della socket sorgente
0->parametro opzionale
logfile->il mio file
len-> lunghezza in byte


 write richiede un puntatore a carattere come secondo parametro.
Hai ragionissima. M'è sfuggito.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 


 LP

 
?!?
Cosa intendi dire?
La mia frase voleva avere il senso di:
"Anziché scrivere i caratteri della stringa, utilizza gli stessi come 
indirizzi"
come spiegazione del fatto che nel log file ti trovi informazioni 
differenti da quelle che ti aspetti.
LP

 Interessante come cosa,come potrei fare?
Ahem... l'"altrimenti" di Luca sottolineava il rischio, non ti stava
proponendo un'alternativa :-)


 questo articolo e` stato inviato via web dal servizio gratuitohttp://
www.newsland.it/newssegnala
 gli abusi ad 
ab...@newsland.it
Ok ricevuto.Ho capito male io.
Grazie a tutti

Vedo che il tuo problema e' stato risolto.
E' bello vedere un newsgroup che funziona!
Ad ogni modo, come raccomandazione futura, quando ti capita un problema 
di malfunzionamento, non tentare mai di aggirarlo: il problema potrebbe 
essere la manifestazione di qualcosa di piu' grosso, grave e che quando 
meno te lo aspetti ti fa sballare tutto.
I problemi vanno risolti man mano che si presentano, capiti, e 
individuato il motivo per cui si sono presentati, per evitare di 
ripetere in futuro.
Poi si va a cercare nel passato prossimo se per caso lo stesso problema 
non fosse presente in qualche altra riga di codice similare...
Poi, tornando alla parte pratica del codice, hai voluto usare una 
write() per scrivere su un file di log.
La write() e' una funzione a basso livello, che e' insostituibile solo 
in casi veramente particolari o di estrema ottimizzazione.
In tutti gli altri casi, l'uso della write() e' sempre insidioso.
Nel tuo caso, mi pare di aver capito che tu debba scrivere dei dati in 
un file di log.
Ritengo che la cosa piu' semplice da fare, nel tuo caso, sia quella di 
aprire il file con
fp = fopen(file, "a");
scriverci dentro con
fprintf(fp, "%s\n", buffer);
e poi alla fine del programma chiuderlo con
fclose(fp);
L'insidia che nasconde la write() soprattutto in un file di log puo' 
essere la seguente.
supponiamo che il file fd sia aperto in scrittura.
char buffer[12];
strcpy(buffer, "braccobaldo"); // e' lungo 11 quindi ci sta.
write(fd, buffer, sizeof(buffer));
nel fine troverai scritto "braccobaldo"\0x0
e gia' qui forse c'e' uno zero finale di troppo.
se poi qualche riga dopo scrivi
strcpy(buffer, "pippo");
write(fd, buffer, sizeof(buffer));
troveresti nel file "pippo"\0x0"baldo"\0x0
vale a dire dello sporco che ti resta nel buffer.
Potresti ovviare al problema usando strlen(buffer) al posto di 
sizeof(buffer), ma questo solo se hai a che fare con stringhe null 
terminated.
Ma allora, se devi scrivere delle stringhe null terminated, e' molto 
piu' comodo usare la printf() piuttosto che la write().

 Grazie a tutti
Hai preso in considerazione di usare le API BSD standard syslog?
Ovvero openlog, syslog, closelog etc?
Dovrebbe essere disponibile un po' ovunque, Linux compreso.
-- 
blog:  
http://www.akropolix.net/rik0/blogs
 | Uccidete i filosofi,
site:  
http://www.akropolix.net/rik0/
      | tenetevi riso e
forum: 
http://www.akropolix.net/forum/
     | bacchette per voi.