[C] Problema con printf() e system()

Forum dedicato alla programmazione.

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.
Rispondi
mandrago
Linux 0.x
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()

Messaggio 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 ?

Avatar utente
Toni
Linux 3.x
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()

Messaggio 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

mandrago
Linux 0.x
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()

Messaggio da mandrago »

funziona grazie!

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
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()

Messaggio da targzeta »

Dovrebbe bastare anche un '\n'.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
SIV
Linux 3.x
Linux 3.x
Messaggi: 921
Iscritto il: mer 25 apr 2007, 14:07

Re: [C] Problema con printf() e system()

Messaggio da SIV »

Ragazzi chi mi spiega perchè avviene ciò?

Avatar utente
414N
Iper Master
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()

Messaggio 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.

Avatar utente
SIV
Linux 3.x
Linux 3.x
Messaggi: 921
Iscritto il: mer 25 apr 2007, 14:07

Re: [C] Problema con printf() e system()

Messaggio 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

Avatar utente
414N
Iper Master
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()

Messaggio 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.

Avatar utente
SIV
Linux 3.x
Linux 3.x
Messaggi: 921
Iscritto il: mer 25 apr 2007, 14:07

Re: [C] Problema con printf() e system()

Messaggio 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?

Avatar utente
414N
Iper Master
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()

Messaggio da 414N »

Nel link che ti ho riportato più sopra è scritto:
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
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.

Avatar utente
SIV
Linux 3.x
Linux 3.x
Messaggi: 921
Iscritto il: mer 25 apr 2007, 14:07

Re: [C] Problema con printf() e system()

Messaggio 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 :D

Rispondi