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

 

 


Tema destacado:


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / 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.  
2  Programación / Programación C/C++ / Re: Ayuda con Punteros en C. en: 20 Abril 2014, 02:03 am
OK Me pondré a ello. Luego les cuento como me fue. En fin de todas formas gracias. Luego pongo el codigo hecho :)
3  Programación / Programación C/C++ / Ayuda con Punteros en C. en: 20 Abril 2014, 00:21 am
Hola pues no soy muy bueno para usar punteros. Veran tengo que realizar un programa que me conste de tres tareas:

La tarea 1 genera los primeros 500 numeros pares.(0,2,4,6,...1000)
La tarea 2 genera los primeros 500 numeros impares.(1,3,5,7,...999)
La tarea 3 imprime los numeros generados por las dos tareas anterioresen orden (0,1,2,3,4,5...1000).

Mi idea es usar punteros, pues lo que se es que una funcion en C no puede retornar un array, sino un puntero. Hasta ahora tengo esto



Esto es lo que tengo hasta ahora. Se supone que tarea_A y tarea_B me generan dos punteros.
Luego, en que estoy mal????

Código
  1. #include <stdio.h>
  2.  
  3. int* tarea_A()
  4. {
  5. int i;
  6. int j;
  7. int pares[500];
  8. for(i=0; i<=500; i++)
  9. {
  10. pares[i]=i*2;
  11.  
  12. }
  13.  
  14.  
  15. }
  16.  
  17. int* tarea_B()
  18. {
  19. int i;
  20. int j;
  21. int impares[500];
  22. for(i=1; i<=500; i++)
  23. {
  24. impares[i]=(i*2)-1;
  25.  
  26. }
  27.  
  28. }
  29.  
  30.  
  31. void tarea_C()
  32. {
  33. int* ptr_A = 0;
  34. int* ptr_B = 0;
  35.  
  36. ptr_A = tarea_A();
  37. ptr_B = tarea_B();
  38.  
  39. printf("OK %d \n ", *ptr_A);/*se supone que me debe de imprimir un numero-\*/
  40. /*Aca estoy probando a ver si puedo imprimir los numeros*/
  41. }
  42.  
  43. int main()
  44. {
  45. tarea_C();
  46. }
  47.  

Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines