Pagina 1 di 1
[C] Problema con printf() e system()
Inviato: mar 1 mag 2012, 15:00
da mandrago
Ho il seguente programma:
#include <stdio.h>
int main(){
printf("Ok");
system("echo heilà!");
}
Tutto ok, solamente per il fatto che il programma esegue prima la system() che la printf()... come mai ?
Re: [C] Problema con printf() e system()
Inviato: mar 1 mag 2012, 15:11
da Toni
le istruzioni vengono eseguite nella sequenza corretta
l'unica differenza è che lo standard di output non viene letto immediatamente
per forzare questo aggiungi dopo printf
fflush(stdout);
ciao
Re: [C] Problema con printf() e system()
Inviato: mar 1 mag 2012, 15:20
da mandrago
funziona grazie!
Re: [C] Problema con printf() e system()
Inviato: mar 1 mag 2012, 17:40
da targzeta
Dovrebbe bastare anche un '\n'.
Emanuele
Re: [C] Problema con printf() e system()
Inviato: mer 2 mag 2012, 13:01
da SIV
Ragazzi chi mi spiega perchè avviene ciò?
Re: [C] Problema con printf() e system()
Inviato: mer 2 mag 2012, 14:03
da 414N
SIV ha scritto:Ragazzi chi mi spiega perchè avviene ciò?
Direi che è spiegato piuttosto bene
qui.
Semplificando, stdout è bufferizzato di default nella maggioranza dei casi e non stampa a video una stringa finché non incontra \n o viene forzato lo svuotamento del buffer con una fflush.
Re: [C] Problema con printf() e system()
Inviato: mer 2 mag 2012, 23:22
da SIV
@414N grazie del link letto ed "approfondito"
Vi espongo i miei dubbi:
1) Da quel che ho potuto capire il buffer è una memoria temporanea in cui vengono immagazzinati dei dati momentaneamente appunto. Lo STDOUT è bufferizzato quindi non stampa finchè non incontra il carattere "\n". (Certo è possibile evitare il problema con fflush, setbuf(), stampare nello STDERR...)
Domanda: che senso ha immagazzinare in un buffer il flusso dei dati in uscita per poi stamparli solo dopo aver raggiunto il carattere \n? Forse la risposta è un commento trovato nel link postato da 414N ma non riesco a capire fino in fondo:
It's probably like that because of efficiency and because if you have multiple programs writing to a single TTY, this way you don't get characters on a line interlaced. So if program A and B are outputting, you'll usually get:
program A output
program B output
program B output
program A output
program B output
This stinks, but it's better than
proprogrgraam m AB ououtputputt
prproogrgram amB A ououtputtput
program B output
Note that it isn't even guaranteed to flush on a newline, so you should flush explicitly if flushing matters to you.
Cioè aspettare che si raggiunga il carattere newline nello STDOUT eviterebbe la sovrapposizione di carattere di programmi che stanno scrivendo contemporaneamente sullo stesso STDOUT?
2) Perchè lo stesso codice:
Codice: Seleziona tutto
#include<stdio.h>
int main()
{
printf("Hello World!");
system("echo Ciao Mondo");
return 0;
}
non dà "problemi"?
Grazie a tutti
Re: [C] Problema con printf() e system()
Inviato: gio 3 mag 2012, 10:24
da 414N
1) Il problema dell'efficienza è dovuto al fatto che, senza buffer, ti ritroveresti a dover aggiornare la schermata alla stampa di ogni singolo carattere/stringa, che non è un'operazione molto "veloce".
Riguardo la seconda parte: se più programmi in esecuzione contemporaneamente scrivessero su stdout senza un buffer, allora gli effetti sarebbero proprio quelli. Puoi fare una prova veloce creando un programmino che esegua un paio di fork e che stampi su stderr (non bufferrizzato) una stringa.
2)Intendi problemi di sovrapposizione di stringhe su stdout? Non può succedere in quel programma, perché, se anche la prima stringa "Hello World!" è ancora pendente nel buffer di stdout, quando viene eseguita la system il processo iniziale viene sospeso (controlla nella man page) fino alla terminazione del comando echo. In sostanza, con questo codice non hai due processi in esecuzione contemporanea, ma uno che parte e l'altro che si ferma nell'attesa che il secondo termini.
Re: [C] Problema con printf() e system()
Inviato: gio 3 mag 2012, 11:54
da SIV
Grazie delle info.
Cercherò di creare un programma per vedere se effettivamente si accavallano i caratteri in uno stream non bufferizzato.
Per il punto 2 intendevo: perchè su Linux viene stampata prima la echo e poi la printf, mentre su Windows viene stampato con ordine regolare prima la printf e poi la echo?
Re: [C] Problema con printf() e system()
Inviato: gio 3 mag 2012, 13:39
da 414N
Nel link che ti ho riportato più sopra è scritto:
Non essendo supportato il buffering di linea, viene utilizzato un full buffering, che provoca la stampa a video non appena questo buffer si riempie, indipendentemente dal \n. In ambito Windows potresti provare ad impostare il buffer ad una dimensione superiore a quella delle stringhe che intendi stampare e vedere se il comportamento è analogo a quello del programma riportato originariamente da mandrago.
Re: [C] Problema con printf() e system()
Inviato: gio 3 mag 2012, 14:49
da SIV
Ah scusami non l'avevo letto. Devo codare un po' per mettere in pratica tutte queste cosette così mi rimangono in testa. Ti ringrazio di tutte le info