2010-01-25 19 views
5

He estado considerando el uso de mmap para la lectura de archivos, y me preguntaba qué tan portátil es. Estoy desarrollando en una plataforma de Linux, pero me gustaría que mi programa funcione en osx y windows.cómo portátil es mmap

¿Puedo asumir que mmap está trabajando en estas plataformas?

gracias

Respuesta

8

La función 'mmap()' es una llamada POSIX. Funciona bien en MacOS X (y Linux, y HP-UX, y AIX, y Solaris).

El área problemática será Windows. No estoy seguro de si hay una llamada _mmap() en el subsistema 'compatibilidad' POSIX. Es probable que esté allí, pero tendrá el nombre con el subrayado inicial porque Microsoft tiene una vista alternativa de los espacios de nombres y considera mmap() para inmiscuirse en el espacio del nombre de usuario, incluso si solicita la funcionalidad POSIX. Puede encontrar una definición de una interfaz alternativa de Windows MapViewOfFile() y una discusión sobre el rendimiento en otra pregunta SO.

2

El principio de un archivo de memoria asignada es bastante portátil, pero que no tienen mmap() en Windows (pero existen cosas como MapViewOfFile()). Puede echar un vistazo al código c de python mmap modules para ver cómo lo hacen para varias plataformas.

3

El uso de mmap para leer archivos no es portátil si utiliza grandes cantidades de archivos grandes en su espacio de direcciones. Los sistemas de 32 bits no pueden tener un espacio útil grande, digamos 1G, de espacio de direcciones disponible. mmap fallaría bastante a menudo para un mapeo 1G.

2

considero la memoria asignada en io UniXS como no utilizable para aplicaciones interactivas, ya que puede resultar en una violación de segmento/SIGBUS (en caso de que el archivo se ha truncado por su parte por algún otro proceso). Haciendo caso omiso de tales "soluciones" enfermas como setjmp/longjmp no hay nada que se pueda hacer aparte de finalizar el proceso después de obtener SIGSEGV/SIGBUS. La nueva característica de G ++ para convertir dichas señales en excepciones parece estar destinada principalmente para las manzanas OS, ya que la descripción indica que se necesita soporte de tiempo de ejecución para esta característica de G ++ y no hay información disponible sobre esta característica de G ++ . Probablemente tengamos que esperar un par de años, hasta que el manejo estructurado de excepciones se pueda encontrar en Windows, ya que hace más de 20 años que llega a los UNIX.

+0

Aunque no respondiste directamente la pregunta, encontré que esto es realmente útil, gracias. –

+0

memoria asignada io no se puede usar para aplicaciones no triviales en UNIX afecta la portabilidad de la memoria asignada io –