Programación en C

Memoria compartida POSIX con programación en C

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

Llamadas de memoria compartida POSIX

Las funciones de memoria compartida POSIX se centraron en el concepto de UNIX de que el objeto debe ser un documento cuando se realizan actividades de entrada / salida en una entidad. Por lo tanto, debido a que recitas e inscribes a una entidad de memoria POSIX mutua, esta última debe ser considerada como un documento. Un documento mapeado en memoria es una entidad de memoria compartida POSIX. Usar el shm_open función de llamada al sistema debajo / dev / shm, se generan documentos de memoria compartida separados. Solo hay dos llamadas al sistema de memoria compartida dedicadas de POSIX, shm_open, y shm_unlink, que están estrechamente relacionados con la apertura y desvinculación de llamadas al sistema de archivos. La ftruncate, mmap, y munmap Las llamadas de marco para documentos se utilizan para realizar otras tareas en la memoria compartida POSIX. Es necesario conectar un programa que utilice llamadas de memoria compartida POSIX para -lrt.

Los programas que utilizan llamadas de memoria compartida POSIX deben seguir los siguientes pasos:

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

Con ftruncate (), el tamaño del objeto será fijo.

Con mapa() y MAP_SHARED, delimita este objeto en el espacio de direcciones actual.

Leer / escribir la memoria compartida.

Vía munmap (), des-delinear la memoria compartida.

Usar cerca() cerrar el objeto.

Mediante shm_unlink (), eliminar el objeto en la memoria compartida.

shm_open ()

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

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

El primer parámetro es el nombre del objeto de memoria compartida. Es una cadena terminada en nulo del /nombre tipo, con la estipulación de que ningún otro carácter puede ser una barra que no sea su primer carácter. Oflag es un pequeño velo creado con varias de las banderas anteriores mediante OR-ing, ya sea a través de O_RDONLY o O_RDWR. Los parámetros descritos indican que su objeto de memoria compartida debe estar formado (O_CREAT) cuando aún no existe y además el objeto está disponible para lectura y escritura (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 POSIX que se desarrolló anteriormente. El descriptor de documento entero para el objeto de memoria compartida se devuelve mediante una llamada efectiva a shm_open (). Como se define debajo de la shm_open (), el nombre del parámetro es el título de la entidad de memoria compartida. La siguiente es la definición de shm_unlink () función:

>> Int shm_unlink (const char * nombre);

ftruncate ()

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

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

Al construir una memoria POSIX compartida, es de hecho cero bytes de capacidad de tamaño. Puede representar la entidad de memoria compartida POSIX con bytes de tamaño a través de truncar. Ftruncate rinde cero en la ejecución. Ftruncate salidas -1 en caso de falla y errno está configurado para desencadenar el error.

mmap ()

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

>> Void * mmap (void * addr, size_t length, 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 de prot pueden diferir, pero usaremos PROT READ | PROT ESCRIBIR. Hay varias banderas, pero MAP SHARED es esencial para la memoria compartida. Ahora, 'fd' es un descriptor de documento que se obtuvo anteriormente. El desplazamiento es el punto donde comienza el mapeo en la entidad de memoria compartida; el valor de compensación 0 también se puede utilizar. En la terminación, mmap () cede el puntero a la posición de mapeo de la entidad de memoria compartida.

munmap ()

En la posición dirigida por addr y obteniendo tamaño, longitud, munmap desmapea el elemento de memoria compartida. Munmap cede 0 al completarse y -1 en la situación de inexactitud, en cuyo caso se asigna errno para desencadenar el error.

>> Void munmap (void * addr, size_t length);

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-example e inscriba tres números en la memoria compartida a través de él. 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 táctil.h
$ touch sender.C
$ receptor táctil.C

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

Ahora compilaremos y uniremos el código anterior usando la palabra clave -lrt por separado para el remitente.c y receptor.archivo c. Aquí está el comando para hacerlo:

$ gcc -o remitente 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

Al ejecutar el código del remitente, el objeto de memoria compartida se ha generado y se puede encontrar debajo / dev / shm usando el siguiente comando:

$ ls -l / dev / shm | grep shmem-example

Cuando ejecutamos el código del receptor, obtendremos el siguiente resultado:

PS ./receptor

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

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

Conclusión

En este artículo, aprendió cómo usar POSIX Shared Memory con programación C en Ubuntu 20.04, incluidas todas las llamadas a funciones utilizadas para establecer la memoria compartida. Espero que este artículo te haya ayudado a mejorar tus conocimientos de programación y haya cubierto todas las dudas que tengas sobre este tema.

Los 5 mejores productos ergonómicos de mouse de computadora para Linux
¿El uso prolongado de la computadora causa dolor en la muñeca o los dedos?? ¿Sufre de rigidez en las articulaciones y constantemente tiene que dar la ...
Cómo cambiar la configuración del mouse y el panel táctil con Xinput en Linux
La mayoría de las distribuciones de Linux se envían con la biblioteca "libinput" de forma predeterminada para manejar eventos de entrada en un sistema...
Vuelva a asignar los botones del mouse de manera diferente para diferentes programas con X-Mouse Button Control
Tal vez necesite una herramienta que pueda hacer que el control de su mouse cambie con cada aplicación que use. Si este es el caso, puede probar una a...