Ver Mensaje Individual
  #3 (permalink)  
Antiguo 19/11/2006, 20:14
Estrella344
 
Fecha de Ingreso: noviembre-2006
Mensajes: 2
Antigüedad: 17 años, 5 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,