Memoria compartida de Posix con programación C

Memoria compartida de Posix con programación C
La memoria compartida POSIX es un marco para la comunicación entre procesos (IPC) especificado en las especificaciones de POSIX. Dos (o más) tareas pueden leerlo y escribir en la zona de memoria compartida mientras establece la memoria compartida. La memoria compartida POSIX no siempre hace cumplir los desembolsos de copias, en contraste con otras estructuras de IPC (E.gramo., tubería, enchufe, etc.), y es deseable para ciertos programas.

POSIX Llamadas de memoria compartida

Las funciones de memoria compartidas de POSIX se centraron en el concepto de UNIX de que el objeto debe ser un documento al realizar actividades de entrada/salida en una entidad. Por lo tanto, debido a que recita e inscribe a una entidad de memoria de Posix mutua, esta última debe considerarse como un documento. Un documento mapeado de memoria es una entidad de memoria compartida de Posix. Usar el shm_open función de llamadas del sistema debajo /dev/shm, Se generan documentos de memoria compartidos separados. Solo hay dos llamadas dedicadas al sistema de memoria compartida de Posix, shm_open, y shm_unlink, que están estrechamente relacionados con las llamadas al sistema de archivos de apertura y no bebida. El ftruncate, mmap, y munmap Las llamadas de marco para documentos se utilizan para realizar otras tareas en la memoria compartida de Posix. Es necesario conectar un programa que utiliza llamadas de memoria compartida POSIX para -LRT.

Los programas que usan las llamadas de memoria compartida POSIX deben pasar por los siguientes pasos:

Usando shm_open (), formar un objeto de memoria compartido. El descriptor del documento se puede revertir si la formación del objeto es exitosa.

Con ftruncate (), El tamaño del objeto se fijará.

Con mapa() y Map_shared, delinear este objeto en el espacio de direcciones actual.

Leer/escribir la memoria compartida.

A través de Munmap (), no delinar la memoria compartida.

Usar cerca() para cerrar el objeto.

A través de shm_unlink (), Eliminar el objeto en la memoria compartida.

shm_open ()

Como se describió anteriormente, shm_open () se usa para generar un nuevo objeto de memoria compartida. Hace que el objeto sea accesible para el procedimiento de llamadas utilizando el descriptor revertido. La siguiente es la definición de esta función de la función:

>> int shm_open (const char *name, int oflag, mode_t modo);

El primer parámetro es el nombre del objeto de memoria compartida. Es una cadena nula de la /nombre Tipo, con la estipulación de que ningún otro personaje puede ser un corte que no sea su primer personaje. Oflag es un pequeño velo creado con varias de las banderas anteriores de Or-Or-, ya sea a través de O_rdonly o O_rdwr. Los parámetros descritos indican que su objeto de memoria compartida debe formarse (o_creat) cuando aún no existe y también el objeto está disponible para leer y escribir (o_rdwr). El último argumento establece las aprobaciones de directorio para el objeto de memoria compartida.

shm_unlink ()

Shm_unlink () elimina la entidad de memoria compartida de Posix que anteriormente se desarrolló. El descriptor de documento entero para el objeto de memoria compartida se devuelve a través de una llamada efectiva a shm_open (). Como se define debajo del shm_open (), El nombre del parámetro es el título de la entidad de memoria compartida. La siguiente es la definición del shm_unlink () función:

>> int shm_unlink (const char *nombre);

ftruncate ()

Al establecer el objeto, el ftruncate () El método se elige para configurar el tamaño de la entidad en bytes. La definición de función es la siguiente:

>> int ftruncate (int fd, off_t longitud);

Al construir una memoria POSIX compartida, de hecho es cero bytes en capacidad de tamaño. Puede representar la entidad de memoria compartida de Posix con bytes de longitud de tamaño a través de ftruncado. Ftruncado produce cero en la ejecución. Ftruncado salidas -1 en caso de falla y errar está configurado para activar el error.

mmap ()

Finalmente, se establece un documento mapeado de memoria con la entidad de memoria compartida a través del mmap () método. Luego, produce un puntero de documento mapeado de memoria que se descartan para llegar a la entidad de memoria compartida. La siguiente es la definición del mmap () función:

>> void *mmap (void *addr, size_t longitud, int prot, int flags, int fd, off_t offset);

En esto, 'addr' es la dirección a la que se asignará. La 'longitud' es el rango de la entidad de memoria compartida. Los valores para PROT pueden diferir, pero usaremos la lectura de protección | Prot Write. Hay varias banderas, pero el mapa compartido es esencial para la memoria compartida. Ahora, 'FD' es un descriptor de documentos que se obtuvo anteriormente. Offset es el punto donde comienza la asignación en la entidad de memoria compartida; El valor de desplazamiento 0 también se puede usar. En la terminación, mmap () produce el puntero a la posición de mapeo de la entidad de memoria compartida.

Munmap ()

En la posición dirigida por la addr y la obtención de tamaño, la longitud, munmap Descansa el elemento de memoria compartida. Munmap produce 0 al finalizar y -1 en la situación de inexactitud, en cuyo caso se asigna errno para activar el error.

>> nulo munmap (void *addr, size_t longitud);

Ejemplo: remitente y receptor

Tomemos el ejemplo del remitente y el receptor. El remitente creará un nuevo objeto de memoria compartida con el nombre /SHMEM-Ejemplo e inscribe tres números en la memoria compartida a través de ella. Ahora, el receptor puede exponer el objeto de memoria compartida y recitar los tres números de la memoria. Crearemos tres archivos con los nombres protocolo.H, remitente.C, y receptor.C.

Protocolo de $ touch.H
$ remitente táctil.C
$ receptor táctil.C

A continuación, agregaremos el código fuente siguiente al protocolo de los archivos.h, "remitente.c, y 'receptor.C.'Ahora, los guardaremos todo y los cerraremos.

Ahora estaremos compilando y uniendo el código anterior utilizando la palabra clave -lrt por separado para el remitente.C y receptor.archivo c. Aquí está el comando para hacerlo:

$ gcc -o remitente de remitente.C -LRT
$ GCC -O receptor receptor.C -LRT

Ahora, ejecutaremos el código del remitente usando el siguiente comando. La salida se da a continuación.

ps ./remitente

Ejecutando el código del remitente, se ha generado el objeto de memoria compartida y se puede encontrar debajo /dev/shm Usando el comando a continuación:

$ ls -l /dev /shm | Grep shmem-examen

Cuando ejecutemos el código receptor, obtendremos la salida a continuación:

ps ./receptor

Siempre que la función gm_unlink () se llama usar el receptor del archivo.c, 'el objeto /dev/shm/shmem-examen estará separado. En este caso, no obtendrá ningún objeto en la salida, como se muestra a continuación.

$ ls -l/dev/shm/shmem -examen

Conclusión

En este artículo, aprendió a usar la memoria compartida POSIX con la programación C en Ubuntu 20.04, incluida cada llamada de función utilizada para establecer la memoria compartida. Espero que este artículo te haya ayudado a mejorar tu conocimiento de programación y cubrir cada duda que tienes sobre este tema.