manejo - fwrite en c



¿Qué sucede si no llamo a fclose() en un programa C? (3)

En primer lugar, soy consciente de que abrir un archivo con fopen () y no cerrarlo es terriblemente irresponsable y de mala calidad. Esto es pura curiosidad, así que por favor cántame :)

Sé que si un programa C abre un grupo de archivos y nunca cierra ninguno de ellos, eventualmente fopen () comenzará a fallar. ¿Hay algún otro efecto secundario que pueda causar problemas fuera del código mismo? Por ejemplo, si tengo un programa que abre un archivo y luego sale sin cerrarlo, ¿podría causar un problema a la persona que ejecuta el programa? ¿Podría un programa de ese tipo filtrar algo (memoria, manejadores de archivos)? ¿Podría haber problemas para acceder a ese archivo una vez que el programa haya finalizado? ¿Qué pasaría si el programa se ejecutara muchas veces seguidas?

https://ffff65535.com


Cuando el proceso muere, la mayoría de los sistemas operativos modernos (específicamente el kernel) liberarán todos sus identificadores y memoria asignada.


El estándar C dice que llamar a exit (o, de manera equivalente, regresar desde main ) hace que todos los objetos FILE abiertos se cierren como si fclose . Así que esto está perfectamente bien, excepto que pierdes la oportunidad de detectar errores de escritura.

EDITAR: No hay tal garantía para la terminación anómala ( abort , una assert fallida, la recepción de una señal cuyo comportamiento predeterminado es interrumpir el programa de manera anormal - tenga en cuenta que no hay necesariamente tales señales - y otros medios definidos por la implementación) ) Como han dicho otros, los sistemas operativos modernos limpiarán todos los recursos visibles externamente , como los manejadores de archivos de nivel de SO abiertos, independientemente; sin embargo, los FILE probablemente no se vaciarán en ese caso.

Ciertamente ha habido sistemas operativos que no limpiaron los recursos externos visibles en la terminación anómala; tiende a ir junto con no aplicar límites de privilegios duros entre el código "kernel" y "usuario" y / o entre distintos "procesos" de espacio de usuario, simplemente porque si no tiene esos límites, puede que no sea posible hacerlo de forma segura en todos los casos. (Considere, por ejemplo, qué sucede si escribe basura sobre la tabla de archivos abiertos en MS-DOS, como puede hacerlo perfectamente).


Suponiendo que sale bajo control, utilizando la llamada al sistema exit() o regresando de main() , las transmisiones abiertas de archivos se cierran después de la descarga. El estándar C (y POSIX) lo ordena.

Si sale fuera de control (volcado de núcleo, SIGKILL), etc., o si usa _exit() o _Exit() , las secuencias de archivos abiertas no se vacían (pero los descriptores de archivo terminan cerrados, asumiendo un sistema POSIX-like con descriptores de archivos: el estándar C no exige descriptores de archivos). Tenga en cuenta que _Exit() es obligatorio según el estándar C99, pero _exit() es un mandato de POSIX (pero se comportan igual en los sistemas POSIX). Tenga en cuenta que los descriptores de archivos están separados de las secuencias de archivos. Consulte la discusión de 'Consecuencias de la terminación del programa' en la página POSIX para _exit() para ver qué sucede cuando un programa finaliza en Unix.





fclose