2013-07-03 11 views
6

Esistono 2 programmi diversi, sono piccole, ad esempio:fork() in C utilizzando printf

int main() 
{ 
     printf ("print hello"); 
     fork(); 
} 

int main() 
{ 
     printf ("print hello\n"); 
     fork(); 
} 

uscita 1 è: `helloprint stampa ciao

uscita 2 è : print hello

La domanda è: perché quello con lo \n stampa una sola volta e il primo lo fa due volte?

risposta

8

Si sta verificando il comportamento di buffering dell'implementazione printf del sistema. Nel primo caso, la stringa viene stampata su un buffer, ma dal momento che non c'è una nuova riga (e non hai chiamato fflush), è semplicemente seduto lì in quel buffer. Quindi si biforca e entrambi i buffer biforcati vengono svuotati all'uscita dei rispettivi processi.

Nel secondo caso, lo \n causa il flussaggio del buffer prima del della forcella, quindi non rimane alcun output residuo all'uscita dei processi biforcati.

+4

grazie! Capisci ora. – DDukesterman

4

Cambio:

printf ("print hello"); 
    fork(); 

a

printf ("print hello"); 
    fflush(stdout); 
    fork(); 

Per impostazione predefinita, stdout è di solito line-buffered. Nel tuo esempio 2) hai la garanzia che stdout viene svuotato prima del fork ma nell'esempio 1) potrebbe succedere dopo lo fork. Flushing stdout prima dello fork garantisce di stampare la stringa prima dello fork.

+2

questo davvero non risponde "perché" – DRC