|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
[C] Info printf...
Salve
una info: in un programma, avendo una porzione di codice del genere . . printf("Primo output\n"); printf("Secondo output\n"); . . dopo averlo compilato, se provo a redirigere l'output su un file, in questo sarà visualizzato solo il secondo output che ha sovrascritto il primo, nonostante il \n... Why? Thanks
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ...
|
|
|
|
|
|
#2 | |
|
Junior Member
Iscritto dal: Sep 2004
Messaggi: 20
|
Quote:
prova a scrivere una riga e poi aprire il file facendo append e mettendo la 2° |
|
|
|
|
|
|
#3 | ||
|
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
Quote:
./a.out > test.txt così otterò l'output direttamente nel file test.txt Quote:
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ...
|
||
|
|
|
|
|
#4 | |
|
Junior Member
Iscritto dal: Sep 2004
Messaggi: 20
|
Quote:
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
secondo me, se hai questo problema, qualcosa nel codice non è corretto.
Questo semplice codice: Codice:
#include <stdio.h>
int main()
{
printf("primo out\n");
printf("secondo out\n");
}
Al limite, prova a compilare così: Codice:
gcc nome_tuo_file.c -Wall -o prova
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#6 |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Probabilmente dico una stupidaggine, ma... le stringhe che stampi con printf, finiscono con '\n' o con '\r'?
Perché il comportamento, sembra quello del secondo caso... In alternativa, potrebbe esserci stata una fopen o una freopen in modalità "w" anziché "a" tra i due printf: ma non mi sembra sia il tuo caso... Tanto per fare una prova del nove: dopo aver lanciato il programma con l'output rediretto, fai una dir (o un ls -l) sul file test.txt, e controlla la sua lunghezza: se è 15 o 16, allora effettivamente c'è una riscrittura del vecchio file.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
Allora raga, perdonatemi... In effetti, come ha giustamente fatto notare RaouL_BennetH, manca una riga a quella porzione di codice (non me l'ero dimenticata: è che credevo il problema fosse la printf...
)La porzione di codice è : Codice:
.
.
printf("Primo output\n");
printf("Secondo output\n");
execlp("echo","echo","Terzo output",NULL);
.
.
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ...
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Aggiungi un fflush(stdout) prima della exec.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Sinceramente non so, mi viene in mente fflush ma non so se sia standard
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
Si grazie: in effetti funziona "bene" con la flush...
Giusto per capire: perchè è indispensabile usare tale funzione?
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ...
|
|
|
|
|
|
#11 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
Quote:
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ...
|
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Questo però non spiega completamente il comportamento che osservi, in quanto stdout è line-buffered (ovvero l'output viene scritto al termine di una riga). Infatti a me il tuo programma funziona senza flush (_solo_ se l'ultima printf usa un \n); sarebbe interessante sapere perché sul tuo non funziona. Puoi dirmi che s/o stai usando?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Se non vuoi questa bufferizzazione, devi usare le funzioni native del s/o (ad es. write() )
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
Quote:
Compilando tale prog Codice:
#include <stdio.h>
int main()
{
execlp("echo","echo","Terzo output",NULL);
printf("Primo output\n");
printf("Secondo output\n");
}
Come mai?
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ...
|
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Nov 2000
Città: Salerno
Messaggi: 4338
|
Quote:
Ma non sono riuscito cmq a individuare il motivo di tale comportamento...
__________________
Doc : "Ovviamente, il continuum temporale è stato interrotto creando questa nuova temporale sequenza di eventi risultante in questa realtà alternativa" Marty : ...
|
|
|
|
|
|
|
#18 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Nel problema di Fire Fox II i dati nel kernel non ci arrivano proprio, in quanto gli stream FILE * utilizzano un tipo di bufferizzazione aggiuntivo, completamente gestito in user space. Una strace ti rivelerà che i dati al kernel non vengono mai passati tramite la sys_write, quindi in page cache non ci arrivano mai Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 Ultima modifica di ilsensine : 24-06-2005 alle 08:54. |
||
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quindi, dopo la exec, il processo chiamante (o meglio la sua "immagine") non esiste più; è stato sostituito da un altro. Il pid non cambia, e i descrittori (che vivono in kernel space, quindi sopravvivono alla "distruzione" dell'immagine user space del processo) generalmente vengono lasciati inalterati.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:24.











)








