Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Ancora su programmazione UNIX / C

    Salve raga

    allora, compilando questo prog

    codice:
    #include <unistd.h>
    
    int main (void)
    {
        printf("Prima frase\n"); 
        execlp("echo", "echo", "Seconda frase", NULL);
        exit(0); }
    e provando a dare 2 output "diversi" (in pratica una volta a schermo, ed una volta in un file txt) ottengo 2 risultati diversi...

    A schermo mi visualizza

    Prima frase
    Seconda frase


    mentre nel file txt viene memorizzato solo

    Seconda frase

    nonostante la printf abbia lo "\n" che dovrebbe rimandare a capo...

    Perchè? :master:

    Thanks for help

  2. #2
    Help

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    74
    mm...ho provato a commentare la execlp e la prima frase viene stampata....
    Non so bene come funziona la execlp , ma sembra che blocchi la redirezione.
    Anche se dopo fai altre printf....

  4. #4
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Sembra che la redirezione dell'output verso un file avvenga soltanto con l'ultimo programma...
    Per spiegarmi meglio...
    Eseguendo:
    $ ./tuo_programma > file.txt
    Viene letto soltanto l'output dell'echo... Dato che e' l'ultimo programma che viene eseguito... E non dei precedenti...


    Non so il perche'
    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  5. #5
    credo che venga prima scritta la "prima frase" dal tuo programma e dopo echo riapre il file in scrittura quindi troncadolo.. potrebbe essere..?
    @_=(115,-17,6);print+map{chr$_[$.=$_-$_]*$_**$.+++$_[$.]*$_**$.+++$_[$.]*$_**$.}$.-$...$#_

  6. #6
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Originariamente inviato da adarkar
    credo che venga prima scritta la "prima frase" dal tuo programma e dopo echo riapre il file in scrittura quindi troncadolo.. potrebbe essere..?

    Se esegui un programma cosi':
    codice:
    #include <unistd.h>
    
    int main (void)
    {
        printf("Prima frase\n"); 
        sleep ( 5 );
        execlp("echo", "echo", "Seconda frase", NULL);
        exit(0); }
    Passano 5 secondi da quando stampi la prima frase a quando stampi la seconda...
    Se durante questi 5 secondi leggi quel file di testo non ci troverai niente scritto...

    Potrebbe essere che la shell lo mantiene nel buffer... Ma allora perche' poi lo dovrebbe cancellare?
    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  7. #7
    beh io i test non li ho fatti, andavo a naso..
    se dopo la printf ci mettiamo una flush..?
    @_=(115,-17,6);print+map{chr$_[$.=$_-$_]*$_**$.+++$_[$.]*$_**$.+++$_[$.]*$_**$.}$.-$...$#_

  8. #8
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Originariamente inviato da adarkar
    beh io i test non li ho fatti, andavo a naso..
    se dopo la printf ci mettiamo una flush..?
    Leggiti un po' QUA'

    Le funzioni di input output su terminale (printf, scanf etc) sono per default line buffered, e non vedo niente in quelle poche righe di codice che modifichi i FILE o file descriptors di stdout o STDOUT_FILENO...
    Quindi, se c'e' il \n la stringa viene automaticamente flushata...
    Non so pero' se l'echo usi anch'esso funzioni line buffered o cos'altro... Pero', in qualunque modo gestisca il buffer, mi sembra strano che si memorizzi quella stringa e poi la sovrascriva con la successiva
    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  9. #9
    sembra strano anche a me, anche secondo me dovrebbe flushare automaticamente se c'è il \n però a quanto pare non lo fa.. se lo flushi a mano invece funziona, provare per credere
    @_=(115,-17,6);print+map{chr$_[$.=$_-$_]*$_**$.+++$_[$.]*$_**$.+++$_[$.]*$_**$.}$.-$...$#_

  10. #10
    Lo standard ANSI C specifica inoltre che lo standard output e lo standard input siano aperti in modalità fully buffered quando non fanno riferimento ad un dispositivo interattivo
    Linux, come BSD e SVr4, specifica il comportamento predefinito in maniera ancora più precisa, e cioè impone che lo standard error sia sempre unbuffered (in modo che i messaggi di errore siano mostrati il più rapidamente possibile) e che standard input e standard output siano aperti in modalità line buffered quando sono associati ad un terminale (od altro dispositivo interattivo) ed in modalità fully buffered altrimenti.
    non dovrebbe essere quindi aperto in fully buffered il nostro file che non viene scritto correttamente?
    @_=(115,-17,6);print+map{chr$_[$.=$_-$_]*$_**$.+++$_[$.]*$_**$.+++$_[$.]*$_**$.}$.-$...$#_

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.