Foros del Web » Soporte técnico » Windows »

Uso de memoria compartida

Estas en el tema de Uso de memoria compartida en el foro de Windows en Foros del Web. Buen día, Existe una manera, de lograr que un proceso que lee datos de una memoria compartida no dependa el proceso que creó dicha memoria, ...
  #1 (permalink)  
Antiguo 17/11/2006, 20:47
 
Fecha de Ingreso: noviembre-2006
Mensajes: 2
Antigüedad: 17 años, 4 meses
Puntos: 0
Pregunta Uso de memoria compartida

Buen día,

Existe una manera, de lograr que un proceso que lee datos de una memoria compartida no dependa el proceso que creó dicha memoria, todo lo anterior sobre el sistema operativo Windows. A lo que me refiero es que en Linux, cuando creo un área de memoria compartida el programa (o proceso) la crea, termina y se cierra. Posteriormente otro proceso puede leer su datos sin necesidad de que se siga ejecutando el programa que la creo. En cambio, en Windows, tengo que mantener el programa “abierto” para que otro proceso pueda leer los datos, de lo contrario no podrá obtener la información. El problema de lograr la equivalencia en funcionamiento es debido a que se esta tratando de tener la portabilidad del sistema, principalmente entre Linux y Windows. El detalle esta en la forma de creación de la memoria compartida por falta de algún parámetro o bandera que no conozco. O posiblemente a lo que me refiero no existe y el detalle este en el sistema operativo fork() y CreateProcess().
  #2 (permalink)  
Antiguo 18/11/2006, 12:48
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 2 meses
Puntos: 19
Mirate:

http://www.wikilearning.com/crear_zo...ccp-3851-7.htm
Cita:
...
Además de compartir datos entre procesos, Windows permite desligar estos datos cuando alguno de los procesos hagan modificaciones. Es decir, los datos se comparten inicialmente, y continúan en este estado mientras no hayan sido modificados, cuando alguno de los procesos cambie el contenido de una página, se hará una copia de esta página y las modificaciones se harán sobre la nueva copia. El proceso que modificó el contenido ahora proyectará su memoria sobre la copia de la página, en vez de la página compartida. Este comportamiento se denomina "Copy on Write" o "Copia con escritura" y es uno de los métodos más utilizados en distintos sistemas operativos.

Windows proporciona otros métodos para compartir datos entre procesos, como el obsoleto DDE o el mensaje WM_COPYDATA, aunque internamente utiliza una sistema basado en archivos proyectados en memoria.
...
Suerte
  #3 (permalink)  
Antiguo 19/11/2006, 20:14
 
Fecha de Ingreso: noviembre-2006
Mensajes: 2
Antigüedad: 17 años, 4 meses
Puntos: 0
Hola dogduck.

Muchas gracias por tu tiempo y consejo. Lamento no haber sido clara en el planteamiento. He usado archivos proyectos en memoria para la creación de memoria compartida en Windows (justo lo que indicaste que usara), fue en este contexto donde me surgió detalle que no he podido resolver.

Estoy programando en c++ (portable hasta ahora entre Visual c++, Borland, y gcc de suse Linux 9.0, por la características del sistema de adquisición que tengo que realizar), hice una clase que crea áreas de memoria compartida. En los dos sistemas operativos funciona, solo que tiene una diferencia muy marcada, (el problema que indique en el mensaje anterior), en Windows tengo que tener dos consolas abiertas para lograr ver los datos en memoria. En Windows es necesario mantener el programa, que crea el área de memoria compartida, “ejecutándose”, para que otro programa, que se encarga de leer los datos en memoria compartida, pueda obtenerlos. En Linux no es necesario esto.

Windows
//Crear memoria compartida en Windows
hObjProy = CreateFileMapping(
INVALID_HANDLE_VALUE, //Usa archivo de pagina
Seguridad, //Atributos de seguridad: Ninguno
permisos, //Acesso: Lectura y escritura
TamMaxHigh, //tamaño: 32 bits alto
tam, //tamaño: 32 bits bajo
NombreID); //Nombre del objeto map

hVista = (LPVOID) MapViewOfFile(
hObjProy, //Objeto para la vista del archivo
FILE_MAP_ALL_ACCESS, //Acesso: lectura y escritura
0, //higt offset: de map
0, //low offset: principio
0);

Linux…
//Obtener llave para la memoria compartida en Linux…

llave = ftok(archivo, id_llave);
if (llave == -1) {
perror("Obtener llave para memoria compartida (ftok())");
return NULL;
}

//Crear memoria compartida y obtiene su identidicador
id_mem = shmget (llave, tam, permisos | IPC_CREAT);
#ifdef DEBUG
cout << "Idmem = " << id_mem << endl;
#endif
if (id_mem == -1) {
perror("shmget");
return NULL;
}

//Unir el presente proceso con el áerea de memoria compartida
//El primer argumento es el identificador de la memoria, el
//segundo es la dirección de inicio (si se deja 0, el sistema
//operativo lo asigna) y el tercer argumento es para banderas.

direccion = shmat (id_mem, 0, 0);

Saludos,
  #4 (permalink)  
Antiguo 19/11/2006, 22:16
Avatar de Misionero  
Fecha de Ingreso: enero-2005
Mensajes: 65
Antigüedad: 19 años, 2 meses
Puntos: 0
Checa esto, a ver si te puede servir,

http://msdn2.microsoft.com/en-gb/library/ms686958.aspx

en la parte de abajo especifica que si se puede, entonces hay que checar la funcion CreateProcess.

Saludos ...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:49.