elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Un problema con Memoria Compartida
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Un problema con Memoria Compartida  (Leído 1,740 veces)
camv123

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Un problema con Memoria Compartida
« en: 24 Abril 2014, 16:36 pm »

Buenos d'ias.
Pues veran estoy implementando 2 programas, para demostrar el uso de la Memoria compartida en lenguje C.
P1.C crea la zona de memoria a compartir y escribe en ella. Se muestra por consola lo escrito
P2.C va a la memoria y lee lo que hay escrito en ella. se muestra por consola lo leido.

Pero tengo un pequeño problema que no he podido solucionar en el archivo P2.C; lo que pasa es que no me ubica la zona de memoria especifica, y pues obviamente si no puede ubicar esta zona, no podra leer nada. Tengo entendido que la zona de memoria comprtida cuenta con una clave y un Id y debe de ser las misma para ambos Programas. Al imprimir las claves por pantalla me di cuenta de que son las mismas, pero en P2.C no me reconoce el id sociado a la clave comun.
Este es el codigo que tengo. Les dejare ambos archivos fuete. Por favor espero me ayuden y si en algo estoy mal, pues leo sus correciones. Gracias.

Código
  1. //
  2. // p1.c
  3. #include <sys/shm.h>
  4. #include <stdio.h>
  5. #include <unistd.h>
  6.  
  7. void main()
  8. {
  9. key_t Clave;
  10. int Id_Memoria;
  11. int *Memoria = NULL;
  12. int i,j;
  13.  
  14. //
  15. // Conseguimos una clave para la memoria compartida. Todos los
  16. // procesos que quieran compartir la memoria, deben obtener la misma
  17. // clave. Esta se puede conseguir por medio de la función ftok.
  18. // A esta función se le pasa un fichero cualquiera que exista y esté
  19. // accesible (todos los procesos deben pasar el mismo fichero) y un
  20. // entero cualquiera (todos los procesos el mismo entero).
  21. //
  22. Clave = ftok ("/bin/ls", 33);
  23. if (Clave == -1)
  24. {
  25. printf("No consigo clave para memoria compartida\n");
  26. exit(0);
  27. }
  28. printf("la clave de la memoria compartida es: %d\n", Clave);
  29.  
  30. //
  31. // Creamos la memoria con la clave recién conseguida. Para ello llamamos
  32. // a la función shmget pasándole la clave, el tamaño de memoria que
  33. // queremos reservar (100 enteros en nuestro caso) y unos flags.
  34. // Los flags son  los permisos de lectura/escritura/ejecucion
  35. // para propietario, grupo y otros (es el 777 en octal) y el
  36. // flag IPC_CREAT para indicar que cree la memoria.
  37. // La función nos devuelve un identificador para la memoria recién
  38. // creada.
  39. //
  40. Id_Memoria = shmget (Clave, sizeof(int)*100, 0777 | IPC_CREAT);
  41. if (Id_Memoria == -1)
  42. {
  43. printf("No consigo ID para memoria compartida\n");
  44. exit (0);
  45. }
  46. printf("el ID de la memoria compartida es: %i\n", Id_Memoria);
  47.  
  48. //
  49. // Una vez creada la memoria, hacemos que uno de nuestros punteros
  50. // apunte a la zona de memoria recién creada. Para ello llamamos a
  51. // shmat, pasándole el identificador obtenido anteriormente y un
  52. // par de parámetros extraños, que con ceros vale.
  53. //
  54. Memoria = (int *)shmat (Id_Memoria, (char *)0, 0);
  55. if (Memoria == NULL)
  56. {
  57. printf("No consigo memoria compartida\n");
  58. exit (0);
  59. }
  60.  
  61. //
  62. // Ya podemos utilizar la memoria.
  63. // Escribimos cosas en la memoria. Los números de 1 a 10 esperando
  64. // un segundo entre ellos. Estos datos serán los que lea el otro
  65. // proceso.
  66. //
  67. for (i=0; i<10; i++)
  68. {
  69. for (j=0; j<100; j++)
  70. {
  71. Memoria[j] = i;
  72. }
  73. printf("Escrito: %d\n",i);;
  74.  
  75. sleep (1);
  76. }
  77.  
  78. //
  79. // Terminada de usar la memoria compartida, la liberamos.
  80. //
  81. shmdt ((char *)Memoria);
  82. shmctl (Id_Memoria, IPC_RMID, (struct shmid_ds *)NULL);
  83. }
  84.  

Código
  1. // p2.c Aca hay un problema, no me reconoce la zona de memoria que he creado en p1.c
  2. //
  3. #include <sys/shm.h>
  4. #include <stdio.h>
  5. #include <unistd.h>
  6. void main()
  7. {
  8. key_t Clave;
  9. int Id_Memoria;
  10. int *Memoria = NULL;
  11. int i,j;
  12.  
  13. //
  14. // Igual que en p1.c, obtenemos una clave para la memoria compartida
  15. //
  16. Clave = ftok ("/bin/ls", 33);
  17. if (Clave == -1)
  18. {
  19. printf("No consigo clave para memoria compartida\n");
  20. exit(0);
  21. }
  22. printf("la clave de la memoria compartida es: %d\n", Clave);
  23. //
  24. // Igual que en p1.cc, obtenemos el id de la memoria. Al no poner
  25. // el flag IPC_CREAT, estamos suponiendo que dicha memoria ya está
  26. // creada. LA VERDAD CREO QUE ESTO NO FUNCIONA. PERO LEI QUE DEBERIA DE FUNCIONAR
  27. //
  28. Id_Memoria = shmget (Clave, sizeof(int)*100, 0777);
  29. if (Id_Memoria == -1)
  30. {
  31. printf("No consigo ID para memoria compartida\n");
  32. exit (0);
  33. }
  34. printf("el ID de la memoria compartida es: %i\n", Id_Memoria);
  35. //
  36. // Igual que en p1.c, obtenemos un puntero a la memoria compartida
  37. //
  38. Memoria = (int *)shmat (Id_Memoria, (char *)0, 0);
  39. if (Memoria == NULL)
  40. {
  41. printf("No consigo memoria compartida\n");
  42. exit (0);
  43. }
  44.  
  45. //
  46. // Vamos leyendo el valor de la memoria con esperas de un segundo
  47. // y mostramos en pantalla dicho valor. Debería ir cambiando según
  48. // p1 lo va modificando.
  49. //
  50. for (i=0; i<10; i++)
  51. {
  52. printf("Leido: %d\n",Memoria[0]);
  53. sleep (1);
  54. }
  55.  
  56.  
  57. //
  58. // Desasociamos nuestro puntero de la memoria compartida. Suponemos
  59. // que p1 (el proceso que la ha creado), la liberará.
  60. //
  61. if (Id_Memoria != -1)
  62. {
  63. shmdt ((char *)Memoria);
  64. }
  65. }
  66.  


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines