PDA

View Full Version : domanda per esperti


Oppid
23-04-2006, 21:54
Salve ragazzi, mi trovo di fronte ad un problema a cui non riesco a trovare una spiegazione!
Supponendo di avere un file scritto in c che contiente una:

char *str = "Ciao mondo";
printf("Salve mondo\n");
write(1,str,10);

il problema è il seguente:
Se eseguo normalmente a.out viene eseguita prima la printf e poi la write.
Ma se eseguo a.out > file ; cat file, viene eseguita prima la write e poi la printf!
Come mai accade questo!!!??? :confused: :confused: :confused: :mc: :mc: :mc:

ArtX
23-04-2006, 22:07
forse è meglio se lo chiedi sulla sezione programmazione ;)

VICIUS
24-04-2006, 10:21
Sposto in programmazione.

ciao ;)

andbin
24-04-2006, 12:14
char *str = "Ciao mondo";
printf("Salve mondo\n");
write(1,str,10);Innanzitutto tieni presente che stai usando 2 funzioni di I/O ad un diverso livello. write è una delle funzioni native di Linux. printf è una delle funzioni della libreria standard del "C".
Le funzioni di I/O come la printf sono, notoriamente, bufferizzate. Le funzioni native come la write non credo che siano bufferizzate (dovrei comunque leggere bene la documentazione ;) ).

Non so spiegarti esattamente e precisamente perché c'è questa differenza. Credo che il problema sia appunto una questione legata al buffering.

In generale, comunque, bisogna stare attenti ad utilizzare in modo "mixato" le funzioni native e le funzioni "di alto livello" della libreria standard del "C". Se vuoi risolvere la cosa, puoi fare così:
char *str = "Ciao mondo";
printf("Salve mondo\n");
fflush (stdout);
write(1,str,10); In questo modo (ho provato) hai sempre la stessa sequenza di output.

Oppid
24-04-2006, 13:24
Innanzitutto tieni presente che stai usando 2 funzioni di I/O ad un diverso livello. write è una delle funzioni native di Linux. printf è una delle funzioni della libreria standard del "C".
Le funzioni di I/O come la printf sono, notoriamente, bufferizzate. Le funzioni native come la write non credo che siano bufferizzate (dovrei comunque leggere bene la documentazione ;) ).

Non so spiegarti esattamente e precisamente perché c'è questa differenza. Credo che il problema sia appunto una questione legata al buffering.

In generale, comunque, bisogna stare attenti ad utilizzare in modo "mixato" le funzioni native e le funzioni "di alto livello" della libreria standard del "C". Se vuoi risolvere la cosa, puoi fare così:
char *str = "Ciao mondo";
printf("Salve mondo\n");
fflush (stdout);
write(1,str,10); In questo modo (ho provato) hai sempre la stessa sequenza di output.

andbin grazie per la risposta e per il codice esatto che risolve la cosa! :D
Cmq sono riuscito a capire il perchè....o almeno credo, quindi adesso lo scrivo casomai servisse ad altri!
La write come hai detto tu è una funzione nativa di linux ed è UNDBUFFERED, cioè appunto le istruzioni di I/O non bufferizzano i caratteri e vengono eseguite immediatamente, mentre la printf è una funzione della libreria standard di I/O ed è LINEBUFFERED ossia il buffer viene svuotato (e l'operazione di I/O viene eseguita) ogni qualvolta si incontra un carattere di newline o quando questo è pieno. Quindi viene prima "scritta" la write perchè essendo unbuffered i caratteri vengono scritti immediatamente, e poi la printf quando si incontra il carattere di newline....in sostanza è quello che avevi detti tu, più o meno. Grazie e ciao! :D

Bahamut Zero
25-04-2006, 19:39
Oppid domani andiamo insieme all'esame della Rescigno? :asd:

andbin
25-04-2006, 19:46
Oppid domani andiamo insieme all'esame della Rescigno? :asd:Della serie ... "come è piccolo il mondo". ;)

rdefalco
26-04-2006, 00:37
Della serie ... "come è piccolo il mondo". ;)
:D qui in sezione programmazione ne vengono spesso di colleghi miei di studio...

EDIT: oltretutto suggerirei, quando capita, di scriverlo che si tratta di un esercizio di esame. Anche a me è capitato di vedere richieste alquanto "bizzarre" che diventano "normali" viste in un ottica di esame. Almeno si capisce che è un problema da spiegare e NON da risolvere...

Oppid
26-04-2006, 10:25
Oppid domani andiamo insieme all'esame della Rescigno? :asd:

ahuahuahuahuahuahuaahu.....con Abate cmq! :D :D :D

rdefalco
26-04-2006, 16:53
:yeah: tutto fatto!