2012-05-22 21 views
6

Estaba experimentando con fork() y la reorientación para verificar si las nuevas direcciones hechas en la matriz también se aplican al niño. Escribí el siguiente programa sencilloDeclaración antes de la impresión de la horquilla() dos veces

#include<stdio.h> 
#include<unistd.h> 
#include<stdlib.h> 

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 salida (error.txt) Tengo es

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

Sorprendentemente, ERROR! WHY DONT U UNDERSTAND? es impresión doble a pesar de que aparece mucho antes de que el fork() se llama y debe solo se imprimirá una vez por el padre.

¿Alguien puede arrojar algo de luz sobre esto?

+0

No estoy seguro acerca de esto, pero asegúrese de enjuagar io-buffers, antes de la bifurcación. tal vez los buffers se copian al niño. – lupz

+2

¡Esto sería una excelente pregunta para la entrevista! – dasblinkenlight

Respuesta

10

Dado que después de reopen la transmisión no es interactiva, está completamente protegida y no se descarga en '\n'. Antes de fork se llama el búfer que todavía contiene el mensaje, y después de fork este mensaje almacenado en el búfer se duplicó (porque ambos procesos obtuvieron sus propias copias de stdout) y luego el padre y el hijo lo enjuagaron. Ver la parte 7.19.3 del estándar C

Puede evitar este comportamiento llamando al fflush justo antes de fork.

+0

No sé si '\ n' no funciona como un enjuague automático después de la redirección. Gracias y +1 –

+0

También podría usar 'setvbuf' para reconfigurar' stdout'. –

3

Es debido al almacenamiento en búfer. Haga un fflush justo después de printf.

Ambos procesos terminan con la misma copia del material interno de stdio y ambos proceden a enjuagarlo al exit. También puede evitar que suceda si llama al _exit en el niño.

+0

Si cambio 'exit()' a '_exit()', el hijo no está imprimiendo nada. es decir, 'YO SOY NIÑO' falta en la salida. ¿Cuál es la diferencia entre 'exit()' y '_exit()'? –

+1

@Stacker '_exit' no vacía los búfers stdio. – cnicutar

1

enjuagar el buffer resolverá el problema. use fflush justo después de la instrucción de impresión.

0

Parece que el ERROR! WHY DONT U UNDERSTAND todavía está almacenado en el búfer después de ser bifurcado y es escrito por ambos procesos.

Si agrega

fflush(stdout); 

justo después de su primera búfer interno printf() se vacía y sólo aparece una vez en su archivo.

Cuestiones relacionadas