Estoy intentando averiguar cómo reasignar archivos mapeados en memoria en una Mac (cuando quiero expandir el espacio disponible).¿Realmente no hay mremap en Darwin?
Veo que nuestros amigos en el mundo de Linux tienen mremap
pero no puedo encontrar tal función en los encabezados de mi Mac. /Developer/SDKs/MacOSX10.6.sdk/usr/include/sys/mman.h
tiene la siguiente:
mmap
mprotect
msync
munlock
munmap
- pero sin
mremap
man mremap
confirma mis miedos.
Actualmente estoy teniendo que munmap
y mmmap
si quiero cambiar el tamaño del archivo mapeado, lo que implica la invalidación de todas las páginas cargadas. Debe haber una mejor manera. ¿Seguramente?
Estoy tratando de escribir código que funcione en Mac OS X y Linux. Podría conformarme con una macro para usar la mejor función en cada caso si tuviera, pero preferiría hacerlo correctamente.
¿Está sugiriendo que debería asignar el tamaño más grande posible que pueda desear y llenar el agujero? Es una idea interesante, pero o bien mapeo el rango máximo posible de direcciones y no dejo más direcciones para nada más o utilizo una cantidad menor y corro el riesgo de quedarme sin trabajo. Además, esto no sería multiplataforma (como se indicó en mi pregunta) ya que no podía garantizar que algún sistema de archivos no pusiera a cero el rango completo del archivo y desperdiciara gigabytes. – Joe
Ni siquiera necesita convertir el archivo en un disco tan grande. Simplemente 'mmap' es más grande que el tamaño del archivo. Los accesos más allá del final del archivo resultarán en 'SIGBUS', por lo que deberá' ftruncate' más antes de intentar acceder a partes nuevas a través del 'mmap', pero de lo contrario está bien. –