He estado probando esto durante horas, y googleé todas las cosas en las que pienso, pero me estoy volviendo loco.Punteros dentro del segmento de memoria compartida
que tienen una estructura:
typedef struct {
int rows;
int collumns;
int* mat;
char* IDs_row;
} mem;
no sé el tamaño de la int * (una matriz) y char * hasta el posterior.
Cuando lo haga, puedo crear la memoria compartida como esto:
mem *ctrl;
int size = (2 + ((i-1)*num_cons))*sizeof(int) + i*26*sizeof(char); //I have the real size now
shmemid = shmget(KEY, size, IPC_CREAT | 0666);
if (shmemid < 0) {
perror("Ha fallado la creacion de la memoria compartida.");
exit(1);
}
ctrl = (mem *)shmat(shmemid, 0, 0);
if (ctrl <= (mem *)(0)) {
perror("Ha fallado el acceso a memoria compartida");
exit(2);
}
No hay problema aquí. Luego doy un valor a ctrl-> rows y collumns, y asigno 0 a toda la matriz.
Pero después de eso, escribo algo en el char * y bam, fallo de segmentación.
Depuración del programa Vi que tanto los punteros, mat e IDs_row estaban nulos. ¿Cómo les doy los valores correctos dentro del segmento de memoria compartida?
Intenté eliminar el puntero char *, solo para intentarlo, y luego el error de segmentación estaba en el otro programa conectado a dicha memoria compartida y simplemente comprobé los valores dentro de la matriz (marcando -> filas y -> collumns fue exitosa)
¡Gracias! Nunca pensé en hacer el shmget para cada puntero. (Ni siquiera entiendo cómo funciona, haciendo la misma llamada pero "fundiéndolo") Ahora hay un problema con el segundo entero en la estructura, las "columnas". Pongo un "1" allí en un proceso, y el otro proceso lo lee como 62045 o algo así. Intenté cambiar sizeof (ctrl) a sizeof (men) y 2 * sizeof (int) + sizeof (int *) + sizeof (char *), pero no tuve suerte. – Knudow
Disculpa, envié el mensaje y luego lo edité. ¿Me puedes ayudar un poco más? Tengo un problema ahora con el segundo entero en la estructura. – Knudow
@ user1420534 por favor publique una nueva pregunta con este nuevo problema, no parecen estar relacionados. –