Repository 32bit  Forum
Repository 64bit  Wiki

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

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

Messaggioda mandrago » mar mag 01, 2012 14:00

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 ?
mandrago
Linux 1.0
Linux 1.0
 
Messaggi: 30
Iscritto il: ven mar 30, 2012 17:13
Località: Arco (Trento)
Nome Cognome: Daniel
Slackware: 13.37
Kernel: 3.0.4
Desktop: XFCE4

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

Messaggioda Toni » mar mag 01, 2012 14:11

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
Avatar utente
Toni
Linux 2.6
Linux 2.6
 
Messaggi: 993
Iscritto il: lun gen 30, 2006 22:08
Località: milano
Slackware: slackware-14
Kernel: 3.10.5
Desktop: i3

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

Messaggioda mandrago » mar mag 01, 2012 14:20

funziona grazie!
mandrago
Linux 1.0
Linux 1.0
 
Messaggi: 30
Iscritto il: ven mar 30, 2012 17:13
Località: Arco (Trento)
Nome Cognome: Daniel
Slackware: 13.37
Kernel: 3.0.4
Desktop: XFCE4

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

Messaggioda targzeta » mar mag 01, 2012 16:40

Dovrebbe bastare anche un '\n'.

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6186
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

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

Messaggioda SIV » mer mag 02, 2012 12:01

Ragazzi chi mi spiega perchè avviene ciò?
Avatar utente
SIV
Linux 2.6
Linux 2.6
 
Messaggi: 918
Iscritto il: mer apr 25, 2007 13:07
Località: Bari (Provincia)

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

Messaggioda 414N » mer mag 02, 2012 13:03

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
414N
Iper Master
Iper Master
 
Messaggi: 2882
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

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

Messaggioda SIV » mer mag 02, 2012 22:22

@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
SIV
Linux 2.6
Linux 2.6
 
Messaggi: 918
Iscritto il: mer apr 25, 2007 13:07
Località: Bari (Provincia)

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

Messaggioda 414N » gio mag 03, 2012 9:24

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
414N
Iper Master
Iper Master
 
Messaggi: 2882
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

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

Messaggioda SIV » gio mag 03, 2012 10:54

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
SIV
Linux 2.6
Linux 2.6
 
Messaggi: 918
Iscritto il: mer apr 25, 2007 13:07
Località: Bari (Provincia)

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

Messaggioda 414N » gio mag 03, 2012 12:39

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
414N
Iper Master
Iper Master
 
Messaggi: 2882
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

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

Messaggioda SIV » gio mag 03, 2012 13:49

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
Avatar utente
SIV
Linux 2.6
Linux 2.6
 
Messaggi: 918
Iscritto il: mer apr 25, 2007 13:07
Località: Bari (Provincia)


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti