Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Memoria compartida

Estas en el tema de Memoria compartida en el foro de C/C++ en Foros del Web. Hola buenas, tengo un pequeño problema. Mi programa tiene que escribir y leer en memoria pero me da un error de segmentación. Cuando mando algo ...
  #1 (permalink)  
Antiguo 16/04/2015, 09:25
 
Fecha de Ingreso: marzo-2015
Mensajes: 9
Antigüedad: 9 años, 1 mes
Puntos: 0
Memoria compartida

Hola buenas, tengo un pequeño problema.
Mi programa tiene que escribir y leer en memoria pero me da un error de segmentación.

Cuando mando algo a guardar me da este error
./mem e "Palabra"
./mem: Segmentation fault (core dumped)

Código C:
Ver original
  1. #include <sys/types.h>
  2. #include <sys/ipc.h>
  3. #include <sys/shm.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. #define MAXELE 27
  9.  
  10. int main(int argc, char *argv[])
  11. {  
  12.     int id_memoria;
  13.     key_t segmento;
  14.     char *memoria, *cadena;
  15.  
  16.     // Nombre del segmento de memoria
  17.     segmento = 5678;
  18.  
  19.     // Creación del segmento de memoria
  20.   if((id_memoria = shmget(segmento, MAXELE, IPC_CREAT | IPC_EXCL | 0666)) == -1)
  21.   {
  22.     error("shmget");
  23.       exit(1);
  24.   }
  25.  
  26.     // Unión del segmento de memoria a espacio de datos
  27.     if((memoria = shmat(id_memoria, NULL, 0)) == (char *)-1)
  28.   {
  29.     perror("shmat");
  30.     exit(1);
  31.     }
  32.  
  33.   //Escribir en memoria
  34.     if ((strcmp(argv[1],"e")) == 0)    
  35.     //strncpy(argv[2], memoria, MAXELE);    
  36.     memoria = (char *)'a';
  37.  
  38.   //Leer de la memoria
  39.   else if((strcmp(argv[1],"l")) == 0)    
  40.     printf("lo que contiene: \"%s\"\n", memoria);
  41.  
  42.   //Eliminar de la memoria
  43.   else if((strcmp(argv[1],"b")) == 0)
  44.   {
  45.     shmctl(id_memoria, IPC_RMID, NULL);
  46.   }
  47.  
  48.   //Detach
  49.   else if((strcmp(argv[1] ,"d")) == 0)
  50.   {
  51.     if (shmdt(memoria) == -1)
  52.     {
  53.         perror("shmdt");
  54.         exit(1);
  55.     }
  56.   }
  57.  
  58.     return 0;
  59. }
  #2 (permalink)  
Antiguo 16/04/2015, 09:29
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Memoria compartida

Entiendo que estás trabajando en linux, por lo que ahora mismo, que estoy en windows, no puedo ayudarte mucho.

Sin embargo:

Código C:
Ver original
  1. memoria = (char *)'a';

No se si te estás dando cuenta, pero ahí arriba estás cargándote el puntero a la memoria compartida. Ahí "memoria" va a apuntar a la región de la memoria dada por 'a', es decir, a 0x01100001 (el carácter 'a' en binario)

Después llamas a

Código C:
Ver original
  1. if (shmdt(memoria) == -1)

y claro, estás haciendo un detach usando un puntero que no apunta a la memoria compartida.

Imagino que tu problema estará aquí, pero no puedo probarlo.

Un saludo.

Etiquetas: Ninguno
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 06:18.