ninguno aun

Páginas: 5 (1202 palabras) Publicado: 8 de abril de 2013
Memoria compartida en C para Linux
La memoria compartida, junto con los semáforos y las colas de mensajes, son los recursos compartidos que pone unix a disposición de los programas para que puedan intercambiarse información.

En C para unix es posible hacer que dos procesos (dos programas) distintos sean capaces de compartir una zona de memoria común y, de esta manera, compartir o comunicarsedatos.





La forma de conseguirlo en un programa es la siguiente:

En primer lugar necesitamos conseguir una clave, de tipo key_t, que sea común para todos los programas que quieran compartir la memoria. Para ello existe la función key_t ftok (char *, int). A dicha función se le pasa un fichero que exista y sea accesible y un entero. Con ellos construye una clave que nosdevuelve. Si todos los programas utilizan el mismo fichero y el mismo entero, obtendrán la misma clave.

Es habitual como primer parámetro pasar algún fichero del sistema que sepamos seguro de su existencia, como por ejemplo "/bin/ls", que es el "ls" del unix.

Para el entero, bastaría con poner un #define en algún fichero.h de forma que todos los programas que vayan a utilizar la memoria compartidaincluyan dicho fichero y utilicen como entero el del #define
Una vez obtenida la clave, se crea la zona de memoria. Para ello está la función int shmget (key_t, int, int). Con dicha función creamos la memoria y nos devuelve un identificador para dicha zona.

Si la zona de memoria correspondiente a la Clave key_t ya estuviera creada, simplemente nos daría el identificdor de la memoria (siemprey cuando los parámetros no indiquen lo contrario).
El primer parámetro es la clave key_t obtenida anteriormente y que debería ser la misma para todos los programas.
El segundo parámetro es el tamaño en bytes que deseamos para la memoria.
El tercer parámetro son unos flags. Aunque hay más posibilidades, lo imprescindible es:
9 bits menos significativos, son permisos delectura/escritura/ejecución para propietario/grupo/otros, al igual que los ficheros. Para obtener una memoria con todos los permisos para todo el mundo, debemos poner como parte de los flags el número 0777. Es importante el cero delante, para que el número se interprete en octal y queden los bits en su sitio (En C, cualquier número que empiece por cero, se considera octal). El de ejecución no tiene sentido y se ignora.IPC_CREAT. Junto con los bits anteriores, este bit indica si se debe crear la memoria en caso de que no exista.
Si está puesto, la memoria se creará si no lo está ya y se devolverá el identificador.
Si no está puesto, se intentará obtener el identificador y se obtendrá un error si no está ya creada.
En resumen, los flags deberían ser algo así como 0777 | IPC_CREAT
El último paso poderusar la memoria consiste en obtener un puntero que apunte la zona de memoria, para poder escribir o leer en ella. Declaramos en nuestro código un puntero al tipo que sepamos que va a haber en la zona de memoria (una estructura, un array, tipos simples, etc) y utilizamos la función char * shmat (int, char *, int).
El primer parámetro es el identificador de la memoria obtenido en el paso anterior.Los otros dos bastará rellenarlos con ceros.
El puntero devuelto es de tipo char *. Debemos hacerle un "cast" al tipo que queramos, por ejemplo, (mi_estructura *)shmat (...);
Esta función lo que en realidad hace, además de darnos el puntero, es asociar la memoria compartida a la zona de datos de nuestro programa, por lo que es necesario llamarla sólo una vez en cada proceso. Si queremos máspunteros a la zona de memoria, bastará con igualarlos al que ya tenemos.

Ya estamos en condiciones de utilizar la memoria. Cualquier cosa que escribamos en el contenido de nuestro puntero, se escribirá en la zona de memoria compartida y será accesible para los demás procesos.
Una vez terminada de usar la memoria, debemos liberarla. Para ello utlizamos las funciones int shmdt (char *) e int...
Leer documento completo

Regístrate para leer el documento completo.

Estos documentos también te pueden resultar útiles

  • Ninguno Aun
  • Aún ninguno
  • Ninguno Aún
  • Ninguno aun
  • ninguno aun
  • ninguno aun
  • No tengo ningun trabajo aun
  • Aun no tengo ningun discurso

Conviértase en miembro formal de Buenas Tareas

INSCRÍBETE - ES GRATIS