2011-06-04 14 views
5

Soy muy nuevo en C, así que por favor tengan paciencia conmigo. Estoy luchando con esto por mucho tiempo y tuve un momento difícil para reducir la causa del error.C anomalía extraña, al escribir en un archivo (funciona normalmente al escribir en stdout)

Me di cuenta de que al bifurcar el proceso y escribir en un archivo (solo el proceso original escribe en el archivo ocurre algo extraño, la salida casi se multiplica por el número de forks, difícil de explicar, así hice una pequeña prueba código en el que puede correr y se recrea el problema

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


void foo() 
{ 
    FILE* file = fopen("test", "w"); 
    int i=3; 
    int pid; 
    while (i>0) 
    { 
    pid=fork(); 
    if(pid==0) 
    { 
     printf("Child\n"); 
     exit(0); 
    } 
    else if(pid > 0) 
    { 
     fputs("test\n", file); 
     i=i-1; 
    } 
} 

} 

int main() 
{ 
    foo(); 
    exit(EXIT_SUCCESS); 
} 

compilar y ejecutar una vez la manera que es y una vez con file=stdout al escribir en stdout la salida es:..

 
test 
test 
test 

Pero al escribir a la f ile la salida es:

 
test 
test 
test 
test 
test 
test 

Además, si se agrega la indexación y cambiar i a un mayor número se puede ver algún tipo de patrón, pero eso no me ayuda.

Bien dije francamente que no tengo idea de por qué podría suceder esto, ni cómo solucionarlo. Pero soy un novato total en C, así que podría haber una explicación lógica normal para todo esto =).

Gracias por todo su tiempo y sus respuestas.

Respuesta

8

stdout suele estar sin búfer o en línea; otros archivos suelen ser bloqueados en bloque. Necesita fflush() ellos antes de fork(), o cada niño va a tirar su propia copia del búfer, lo que lleva a esta multiplicación.

+0

Muchas gracias por su rápida respuesta. Pasé mucho tiempo revisando todo el código e incluso cuando noté esto, todavía no sabía qué era. Ahora me siento un poco estúpido, pero bueno, todos deben aprender. Gracias de nuevo. – Ben

+1

El texto relevante en POSIX está aquí: http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_05_01 –

+0

No debería 'printf (" Child \ n ");' estar bloqueado mutex? – farhanhubble

Cuestiones relacionadas