IIC2333 / foro-2019-1

Foro oficial del curso IIC2333 - Sistemas Operativos y Redes, semestre 2019-1.
2 stars 0 forks source link

problema con memoria compartida #49

Closed Dunkan1 closed 5 years ago

Dunkan1 commented 5 years ago

Hola tengo un problema con la memoria compartida, estoy creando un pedazo de esta en mi main Screenshot from 2019-04-14 03-54-28

al que le asigno cierta memoria con malloc Screenshot from 2019-04-14 03-54-42

luego en map tambien lo solicito, el problema es que cuando en el proceso map termino de trabajar con este trozo no lo puedo acceder desde el exterior(main).

agradezco cualquier consejo. PD: lo que si funciona es que en main asigno y en map veo, pero no se porque al reves no me funciona

IchottMano commented 5 years ago

Hola!

Que estas tratando de hacer exactamente al hacer malloc? Recuerda que malloc asigna un pedazo de memoria en el heap del proceso, el cual no existe en los demas procesos, por lo que es necesario que guardes tu información directamente en la memoria compartida, no es válido que en memoria compartida guardes un puntero a la información. Saludos!

Dunkan1 commented 5 years ago

pero como se hace si necesito crear el objeto palabra y sh_mem->palabras es una lista de estos punteros?. Hasta ahora esta haciendo lo normal en map para crear la palabra

palabra* pal  = malloc(sizeof(palabra*));
pal -> word  = "un string";
pal -> count = 1;
IchottMano commented 5 years ago

Hola!

Como dije anteriormente, deberás guardar las palabras directamente en la memoria compartida, no usando malloc, lo que puedes hacer es usar la función strcpy para copiar un determinado string en la parte de la memoria compartida que desees. Otra opción es la función memcpy

Saludos!

Dunkan1 commented 5 years ago

algo asi?

lista_palabras* b = malloc(sizeof(lista_palabras*));
b->lista = malloc((num_max_palabras+1)*sizeof(palabra*));
b->n = 0;
memcpy(sh_mem->palabras[i], b, sizeof(lista_palabras*));

pero no me funciona :(

IchottMano commented 5 years ago

El problema es que cuando haces

sh_mem->palabras = malloc(...)

o alternativamente

sh_mem->strings = malloc(...)

Lo que estás haciendo es reservar espacio en la memoria de el proceso y poniendo un puntero en la memoria compartida, que es lo que no puedes hacer.

Dunkan1 commented 5 years ago

okey, creo que mas o menos entiendo, una ultima pregunta, antes yo hacia esto para almacenar una lista de strings (cuando hacia sh_mem->strings = malloc(...))

lista_strings* par_map = malloc(sizeof(lista_strings));
par_map -> n     = num_words;
par_map -> lista = lista_de_palabras;
sh_mem->strings[pid] = par_map;

segun lo que entendi de lo que me dijiste hago esto

shared_mem* sh_mem = (shared_mem*) shmat(shmid, NULL, 0);
int num_words = 0;
sh_mem->strings[pid]->n = num_words;
memcpy(sh_mem->strings[pid]->lista, lista_de_palabras, num_max_palabras * sizeof(char*));

pero me arroja segmentation fault. Por lo que vi esto tambien lo arroja sh_mem->strings[pid]->n = num_words;, lo que no entiendo es como guardar en la memoria compartida PD1: tambien intente con esto:

lista_strings* par_map = malloc(sizeof(lista_strings));
par_map -> n     = num_words;
par_map -> lista = lista_de_palabras;
memcpy(sh_mem->strings[pid], par_map, sizeof(par_map));

PD2: perdon por tantas preguntas, en verdad agradezco la ayuda.

IchottMano commented 5 years ago

¿Podrías mostrarme que es tu struct shared_mem?

Dunkan1 commented 5 years ago
typedef struct shared_mem{
  lista_strings**    strings;
  lista_palabras**   palabras;
  int n;
} shared_mem;
typedef struct palabra{
  char* word;
  int   count;
} palabra;
typedef struct lista_palabras{
  palabra** lista;
  int   n;  // largo de la lista
} lista_palabras;
IchottMano commented 5 years ago

Hola!

Por lo que veo estas intentado castear la memoria compartida como un array de structs que poseen punteros, sin embargo como dije anteriormente, no puedes hacer esto, ya que los punteros pierden el sentido al pasar a otro proceso. Intenta ver, usando memcpy o alternativamente strcpy como poner datos directamente en la memoria compartida, sin usar punteros o structs que posean punteros dentro de ellos, de modo que guardes toda la información que necesites.

Saludos!