Closed Dunkan1 closed 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!
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;
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 :(
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.
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.
¿Podrías mostrarme que es tu struct shared_mem
?
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;
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!
Hola tengo un problema con la memoria compartida, estoy creando un pedazo de esta en mi main
al que le asigno cierta memoria con malloc
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