Instruction avant fork () imprimant deux fois

J’essayais avec fork() et re-direction pour vérifier si les re-directions effectuées dans le parent s’appliquent également à l’enfant. J’ai écrit le programme simple suivant

 #include #include #include int main () { freopen( "error.txt", "w+t", stdout ); // From now on, stdout = error.txt printf (" ERROR! WHY DONT U UNDERSTAND?\n"); if ( fork() == 0 ) { printf(" I AM CHILD\n"); exit(0); } else- { printf (" EITHER I AM A PARENT OR SOMETHING GOT SCREWED\n"); } return 0; } 

La sortie ( error.txt ) que j’ai obtenue est

 ERROR! WHY DONT U UNDERSTAND? EITHER I AM A PARENT OR SOMETHING GOT SCREWED ERROR! WHY DONT U UNDERSTAND? I AM CHILD 

Étonnamment, ERROR! WHY DONT U UNDERSTAND? ERROR! WHY DONT U UNDERSTAND? imprime deux fois même s’il apparaît bien avant l’appel de fork() et ne doit être imprimé qu’une fois par le parent.

Quelqu’un peut-il nous éclairer?

Après la reopen le stream n’est pas interactif, il est entièrement mis en mémoire tampon et n’affiche pas le caractère '\n' . Avant que fork ne s’appelle, le tampon contient toujours le message, et après fork ce message mis en mémoire tampon a été dupliqué (car les deux processus ont leur propre copie de stdout ), puis vidé par le parent et l’enfant. Voir la partie 7.19.3 de la norme C.

Vous pouvez éviter un tel comportement en appelant fflush juste avant fork .

C’est à cause de la mise en mémoire tampon. Faites un fflush juste après printf .

Les deux processus se retrouvent avec la même copie du matériel interne de stdio et les deux procèdent au vidage à la exit . Vous pouvez également empêcher que cela se produise si vous appelez _exit chez l’enfant.

purger le tampon résoudra le problème. utilisez fflush juste après l’instruction print.

Il semble que l’ ERROR! WHY DONT U UNDERSTAND ERROR! WHY DONT U UNDERSTAND est toujours mis en mémoire tampon après le forking et est écrit par les deux processus.

Si vous ajoutez

 fflush(stdout); 

juste après votre première printf() le tampon interne est vidé et il n’apparaît qu’une fois dans votre fichier.