2010-02-15 4 views
19

Cuando se utiliza a nivel de sistema IO en Linux, me di cuenta de que el compilador reconoce las banderas y O_RDONLYO_RDWR, pero no tenía idea alguna en cuanto al significado de las banderas O_BINARY y O_TEXT.No hay indicadores O_BINARY y O_TEXT en Linux?

¿Esto es algo de Linux?

+0

La documentación de Python es rara en ese caso. Las constantes están antes de la descripción de la sección. http://bit.ly/1MmFT51 Tantas personas leerían: "Estas constantes solo están disponibles en Unix" en lugar de "Estas constantes solo están disponibles en Windows" – yucer

Respuesta

0

no hay una diferencia en el nivel de sistema operativo entre archivos binarios y de texto bajo Unix. El archivo de texto tiene solo un contenido restringido. Eso también es cierto para Windows, pero las convenciones utilizadas por C para el final de las líneas son las mismas que usa Unix, mientras que Windows usa el par CR/LF (y un marcador explícito de fin de archivo en algunos contextos, pero el manejo de eso no fue consistente ni siquiera en los programas del sistema la última vez que lo verifiqué), por lo que se necesita una asignación para respetar las convenciones establecidas por C.

1

Es una cosa * nix. * Los sistemas operativos nix no hacen conversión automática de avance de línea para E/S en archivos de "texto", por lo que las banderas O_TEXT y O_BINARY no tendrían sentido.

+0

Responde la pregunta, Informa y educa. Kudos – Jay

0

Windows usa \ r \ n para terminaciones de línea, Linux (y otras Unix-similares) simplemente use \ n. En Windows, la lectura de O_BINARY le proporciona los datos brutos, posiblemente terminaciones de líneas impares y todo, mientras que O_TEXT normaliza los finales de línea, por lo que su código C solo ve un solo carácter.

En Linux et al, no tiene sentido distinguir entre texto y binario, porque los datos solo tienen un solo carácter de todos modos, por lo que los indicadores son innecesarios.

+0

Eso no es verdad. En Windows, leer un archivo en modo de texto todavía le da \ r \ n. La diferencia es cómo funcionan las llamadas a funciones como los fgets (buscan terminaciones de línea y las despojan). – IanNorton

2

En el nivel del lenguaje C y su biblioteca estándar, no existen indicadores O_BINARY y O_TEXT. El modo binario o de texto se selecciona al agregar el especificador b del parámetro de modo de la función fopen. El especificador mismo es, por supuesto, compatible con todas las implementaciones C, pero en las plataformas POSIX este especificador no tiene ningún efecto: según la especificación POSIX, el modo texto es el mismo que el modo binario.

No sorprendentemente, si profundiza en el nivel de las funciones de E/S Unix no estándar específicas de la plataforma, descubrirá que no tienen ningún conocimiento de esa distinción text/binary en absoluto.

+0

O_BINARY/O_TEXT son argumentos para la función abierta, no la función fopen. El estándar C no define una función abierta, pero Posix sí lo hace, y también lo hace Windows. Sin embargo, solo Windows necesita entender la diferencia entre el texto y el binario, por lo que solo Windows define O_BINARY/O_TEXT. (En mi opinión, esto es una pena). –

Cuestiones relacionadas