procesos crear c linux ipc shared-memory mmap

crear - Compartiendo memoria entre procesos mediante el uso de mmap()



crear procesos en linux (3)

¿Es posible adjuntar esa región de memoria al servidor POST bifurcación, después de que el cliente la cree?

MAP_ANONYMOUS|MAP_SHARED se puede acceder a la memoria asignada MAP_ANONYMOUS|MAP_SHARED mediante el proceso que realiza esa llamada mmap() o sus procesos secundarios. No hay forma de que otro proceso asigne la misma memoria porque no se puede hacer referencia a esa memoria desde otro lugar, ya que es anónima .

Usando la llamada shm_open() es posible crear una memoria compartida con nombre a la que se puede hacer referencia y asignar mediante procesos no relacionados.

Estoy en Linux 2.6. Tengo un entorno donde 2 procesos simulan (usando memoria compartida) el intercambio de datos a través de una implementación simple del modo de paso de mensajes.

Tengo un proceso de cliente (bifurcado del padre, que es el servidor) que escribe una estructura (mensaje) en una región asignada a la memoria creada (después de la bifurcación) con

message *m = mmap(NULL, sizeof(message), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0)

Este puntero luego se escribe en una cola (en forma de una lista vinculada) en otra área de memoria compartida que es común al proceso del servidor y del cliente (porque si se creó antes de la bifurcación con el mismo código anterior). Esta área es leída por el servidor que obtiene el puntero al mensaje y lo procesa.

El problema es que * m se crea después de la bifurcación () y cuando el proceso del servidor intenta acceder a la ubicación de la memoria señalada, aparece un error de segmentación. ¿Es posible adjuntar esa región de memoria al servidor POST bifurcación, después de que el cliente la cree?

NOTA: no quiero cambiar el puntero al mensaje antes de bifurcar (y luego compartirlo antes con el servidor) porque normalmente no sé cuántos mensajes quiere enviar el cliente al servidor, y también puede haber más más de 1 proceso de cliente, por lo que me gustaría crear un nuevo bloque de memoria compartida solo cuando un cliente necesita enviar un mensaje y desasignarlo después de que el servidor haya recibido ese mensaje.

NOTA: Esto es para propósitos académicos: Sé que esta no es la mejor manera de resolver este problema, pero solo necesito seguir este camino.

¡Gracias por adelantado!


Eso no va a funcionar.

Si crea una asignación después de la bifurcación (), no será el mismo en el (los) otro (s) proceso (s) relacionado (s).

No puedes asumir el intercambio de punteros de esta manera.

Si realmente quieres hacerlo de esta manera (¡no lo recomendaría!), Debes hacer un mapa de un área grande antes de la bifurcación (), y luego asignar de alguna manera buffers de un tamaño adecuado (¡sin condiciones de carrera en otros procesos, por supuesto! ) y pasar esos punteros.

Dos procesos relacionados que llaman a mmap () después de una bifurcación, pueden recuperar el mismo puntero, apuntando a una memoria diferente. De hecho esto es extremadamente probable.


Solo para cualquiera que lea esta pregunta en 2018 y versiones posteriores. La solución ahora es usar memfd_create para crear un archivo anónimo y usar un socket Unix para pasar este identificador de archivo al otro proceso.

memfd_create es un syscall solo para linux