[C] Problema con printf() e system()
Moderatore: Staff
Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
-
- Linux 0.x
- Messaggi: 30
- Iscritto il: ven 30 mar 2012, 18:13
- Slackware: 13.37
- Kernel: 3.0.4
- Desktop: XFCE4
[C] Problema con printf() e system()
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 ?
#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 ?
- Toni
- Linux 3.x
- Messaggi: 999
- Iscritto il: lun 30 gen 2006, 22:08
- Slackware: slackware-14
- Kernel: 3.10.5
- Desktop: i3
- Località: milano
Re: [C] Problema con printf() e system()
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
l'unica differenza è che lo standard di output non viene letto immediatamente
per forzare questo aggiungi dopo printf
fflush(stdout);
ciao
-
- Linux 0.x
- Messaggi: 30
- Iscritto il: ven 30 mar 2012, 18:13
- Slackware: 13.37
- Kernel: 3.0.4
- Desktop: XFCE4
Re: [C] Problema con printf() e system()
funziona grazie!
- targzeta
- Iper Master
- Messaggi: 6631
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: [C] Problema con printf() e system()
Dovrebbe bastare anche un '\n'.
Emanuele
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
Re: [C] Problema con printf() e system()
Ragazzi chi mi spiega perchè avviene ciò?
- 414N
- Iper Master
- Messaggi: 2922
- Iscritto il: mer 13 feb 2008, 16:19
- Slackware: 15.0
- Kernel: 5.15.19
- Desktop: KDE5
- Località: Bulagna
- Contatta:
Re: [C] Problema con printf() e system()
Direi che è spiegato piuttosto bene qui.SIV ha scritto:Ragazzi chi mi spiega perchè avviene ciò?
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()
@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:
2) Perchè lo stesso codice:
non dà "problemi"?
Grazie a tutti
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:
Cioè aspettare che si raggiunga il carattere newline nello STDOUT eviterebbe la sovrapposizione di carattere di programmi che stanno scrivendo contemporaneamente sullo stesso STDOUT?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.
2) Perchè lo stesso codice:
Codice: Seleziona tutto
#include<stdio.h>
int main()
{
printf("Hello World!");
system("echo Ciao Mondo");
return 0;
}
Grazie a tutti
- 414N
- Iper Master
- Messaggi: 2922
- Iscritto il: mer 13 feb 2008, 16:19
- Slackware: 15.0
- Kernel: 5.15.19
- Desktop: KDE5
- Località: Bulagna
- Contatta:
Re: [C] Problema con printf() e system()
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.
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()
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?
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?
- 414N
- Iper Master
- Messaggi: 2922
- Iscritto il: mer 13 feb 2008, 16:19
- Slackware: 15.0
- Kernel: 5.15.19
- Desktop: KDE5
- Località: Bulagna
- Contatta:
Re: [C] Problema con printf() e system()
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.Note: Microsoft runtime libraries do not support line buffering, so printf("will print immediatelly to terminal"):
http://msdn.microsoft.com/en-us/library/86cebhfs.aspx
Re: [C] Problema con printf() e system()
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