2011-01-20 22 views
5

Necesito asignar memoria pero no puedo usar malloc porque no se vuelve a introducir, así que básicamente implementaré la asignación de memoria dinámica usando la función POSIX mmap. ¿Es posible usar mmap?Use mmap para asignar memoria

+0

"reentrant" se entiende generalmente para incluir todas las funciones de hoja como 'malloc'. 'malloc' no tiene un mecanismo de devolución de llamada a su código, por lo que no hay forma de que pueda volver a ingresarlo de todos modos (en el mismo hilo). Cualquier reentrada estaría completamente dentro y bajo el control de la biblioteca estándar en sí misma. – MSalters

+0

@MSalters: presumiblemente quiere asignar memoria en un manejador de señal, en cuyo caso malloc() no reentrante es un problema. – janneb

+0

@janneb: ¿No es eso prohibido? – MSalters

Respuesta

1

EDIT: reemplazado por reentrada flujos seguros

malloc es seguro para subprocesos en la mayor parte del sistema operativo.

¿Cuál está utilizando y está seguro de que no es seguro para subprocesos? ¿O es necesario que sea reentrante (supongo que no)?

+0

Estoy usando glibc, así que supongo que es una función no reentrante. ¿Crees que puedo usar malloc? – domlao

+6

En la mayoría de los sistemas, hoy malloc es seguro para subprocesos pero no reentrante. – janneb

+1

Sí, puedes usar glibc malloc. Como dice janneb, es seguro para hilos y no reentrante, pero supongo que eso es lo que necesitas. –

5

Sí, mmap() debe reentrada, por lo que debería poder utilizarlo. Tenga en cuenta que mmap() suele ser una operación bastante lenta, por lo que probablemente sea mejor usarla solo en aquellos (con suerte) pocos y muy distantes entre los casos en los que realmente se necesita, en lugar de como un reemplazo de malloc() de propósito general.

POSIX 2008 contiene una lista de funciones de seguridad de señal asíncrona que son seguras para llamar desde una función de manejador de señal (consulte la tabla en la sección 2.4.2 en el enlace). mmap() no está en esa lista, es decir, llamar a mmap() desde una función de manejo de señal puede dar como resultado un comportamiento indefinido.

Lo que puede hacer es evitar asignar memoria a los manejadores de señal, simplemente establezca un indicador y realice el trabajo real más adelante.

+0

No funciona siempre, por ejemplo, si la tarea del controlador de señal es exactamente guardar los datos de señal (para un procesamiento posterior). malloc() no se puede usar debido a la reentrada, la pila no se puede usar porque se destruirá en la devolución del controlador, así es como el OP comenzó a pensar en una solución poco común. – peterh