2012-06-19 26 views
5

Estoy aprendiendo algunas funciones de archivos y, por lo tanto, tengo una duda.¿Por qué tengo que usar close() para cerrar un archivo?

Tengo curiosidad acerca de por qué es necesario llamar al close() para cerrar un archivo? Si no llamé al close() después de leer/escribir un archivo, ¿qué podría pasar? Y si llamé al close(), ¿puedo seguir usando el descriptor de archivo?

+1

Un montón de respuestas a continuación dicen que close() vacía búferes en el disco. Sin embargo, close() es una función POSIX y no existe tal cosa con POSIX close(). Solo libera bloqueos y libera recursos. –

Respuesta

7
  • Si el archivo tiene algún tipo de almacenamiento intermedio detrás de él y no llama cerca, podría perder datos.

  • Si el sistema operativo tiene recursos limitados (por ejemplo, número de archivos abiertos), al no cerrar los archivos, está desperdiciando recursos del sistema.

  • El uso de un descriptor una vez que se cierra el archivo es inútil en el mejor de fallo masivo en el peor (un poco como el uso de la memoria después de que haya sido liberado)

+4

Varias respuestas aquí afirman que los búferes se vacían al cerrar(), pero de hecho eso no es cierto ... POSIX close() no se vacía y no tiene relación con si se escriben o no los datos en el dispositivo. –

2

Si no cierra un archivo abierto para leer, puede bloquearse para escrituras concurrentes. Si no cierra un archivo abierto para escribir, puede perder un último dato escrito que el sistema operativo tiene en el búfer.

Y nunca use un descriptor de archivo ya cerrado. Esto no tiene sentido.

0

Cuando se escribe en un archivo mediante escritura () llamada al sistema, no escribe inmediatamente en el archivo. Entonces, después de sus operaciones, debe llamar a close() para que el búfer se vacíe en el archivo y los cambios persistan. Después de llamar a close(), no puede usar el descriptor de archivo.

+4

write() copia datos del espacio de usuario en búferes del sistema. Los búferes del sistema se descargarán según la conveniencia del sistema o durante una sincronización(). close() no tiene * marcación * en el vaciado de los almacenamientos intermedios. Solo libera bloqueos de archivos y libera recursos. –

0

Cerrar un archivo: Cuando haya terminado con un archivo, debe cerrarse con la función fclose().

fclose(ifp); 
fclose(ofp); 

Cerrar un archivo es muy importante, especialmente con los archivos de salida. La razón es que la salida a menudo se almacena en el búfer. Esto significa que cuando usted le dice C a escribir algo, por ejemplo,

fprintf(ofp, "Whatever!\n"); 

No es necesario que se escriba en el disco de inmediato, pero puede terminar en un bufferen la memoria. Este búfer de salida se sostendría el texto temporalmente: buffer de salida

muestra:

---------------------------------------------- 
| a | b | c | W | h | a | t | e | v | e | r | 
---------------------------------------------- 
| ! | \n | | | | | | | | | | 
---------------------------------------------- 
| | | | | | | | | | | | 
---------------------------------------------- 
| | | | | | | | | | | | 
---------------------------------------------- 
... 

(La memoria intermedia es realmente sólo 1 dimensión pesar de este dibujo.)

Cuando la memoria se llena (o cuando el archivo está cerrado), los datos finalmente se escriben en el disco.

Referencia: http://www.cs.bu.edu/teaching/c/file-io/intro/

+2

Ligeras correcciones. Su respuesta _ parece_ indicar que los archivos se deben cerrar con 'fclose' solamente. También puede cerrar archivos con 'close'. Es solo que 'fclose' toma un puntero de archivo y' close' toma un descriptor de archivo. Además, muchas implementaciones limpian el búfer cuando encuentran un carácter de nueva línea '\ n' –

+0

Gracias por las correcciones. :) – Hrishikesh

+0

La pregunta es acerca de cerrar(), no fclose(). Nada de lo que escribiste aquí es realmente cierto de close(). Y la declaración de Pavan es quizás aún peor ... fopen pares con fclose y open (o creat) pares con close; la diferencia no es solo entre punteros de archivo y descriptores de archivos, sino también entre abstracciones/API bastante diferentes (una de las cuales puede implementarse a través de la otra). –

2

La estrecha() función cierra la conexión entre el programa y un archivo abierto identificado por un mango.Cualquier buffer del sistema no escritas se vacían en el disco, y recursos del sistema utilizados por el archivo se liberan

La parte en negrita es la razón primordial por la cual un archivo debe ser cerrado

Cierre de un archivo tiene las siguientes consecuencias:

1) El descriptor de archivo está desasignado.
2) Se bloquean todos los bloqueos de registro propiedad del proceso en el archivo.
3) Cuando se han cerrado todos los descriptores de archivos asociados con una tubería o FIFO, se descarta cualquier dato no leído.

+1

+1 Sorprendentemente, esta es la única respuesta aquí que no afirma erróneamente que close() vacía los datos. –

0
  • Cuando se escribe en un archivo se escribe primero en una memoria intermedia, algunos función de llamada al ras y los datos se escribe en el archivo, pero otros acaba de escribir en el buffer. Cuando el búfer está lleno, vacía en el archivo sin ninguna llamada directa para una descarga. También puede enjuagar cuando lo desee si quiere estar seguro.
  • Y ya no puede usar el descriptor de archivo después de cerrarlo.
Cuestiones relacionadas