Saltar al contenido

Cómo usar la memoria compartida con Linux en C

Hacemos una verificación exhaustiva cada noticias de nuestra página web con la meta de mostrarte siempre información más veraz y certera.

Solución:

Hay dos enfoques: shmget y mmap. Hablaré de mmapya que es más moderno y flexible, pero puedes echarle un vistazo man shmget (o este tutorial) si prefiere usar las herramientas de estilo antiguo.

Él mmap() La función se puede utilizar para asignar búferes de memoria con parámetros altamente personalizables para controlar el acceso y los permisos, y para respaldarlos con el almacenamiento del sistema de archivos si es necesario.

La siguiente función crea un búfer en memoria que un proceso puede compartir con sus hijos:

#include 
#include 
#include 

void* create_shared_memory(size_t size) 
  // Our memory buffer will be readable and writable:
  int protection = PROT_READ 

El siguiente es un programa de ejemplo que utiliza la función definida anteriormente para asignar un búfer. El proceso principal escribirá un mensaje, se bifurcará y luego esperará a que su hijo modifique el búfer. Ambos procesos pueden leer y escribir en la memoria compartida.

#include 
#include 

int main() 
  char parent_message[] = "hello";  // parent process will write this message
  char child_message[] = "goodbye"; // child process will then write this one

  void* shmem = create_shared_memory(128);

  memcpy(shmem, parent_message, sizeof(parent_message));

  int pid = fork();

  if (pid == 0) 
    printf("Child read: %sn", shmem);
    memcpy(shmem, child_message, sizeof(child_message));
    printf("Child wrote: %sn", shmem);

   else 
    printf("Parent read: %sn", shmem);
    sleep(1);
    printf("After 1s, parent read: %sn", shmem);
  

Aquí hay un ejemplo de memoria compartida:

#include 
#include 
#include 
#include 
#include 
#include 

#define SHM_SIZE 1024  /* make it a 1K shared memory segment */

int main(int argc, char *argv[])
 IPC_CREAT)) == -1) 
        perror("shmget");
        exit(1);
    

    /* attach to the segment to get a pointer to it: */
    data = shmat(shmid, NULL, 0);
    if (data == (char *)(-1)) 
        perror("shmat");
        exit(1);
    

    /* read or modify the segment, based on the command line: */
    if (argc == 2) 
        printf("writing to segment: "%s"n", argv[1]);
        strncpy(data, argv[1], SHM_SIZE);
     else
        printf("segment contains: "%s"n", data);

    /* detach from the segment: */
    if (shmdt(data) == -1) 
        perror("shmdt");
        exit(1);
    

    return 0;

Pasos :

  1. Use ftok para convertir un nombre de ruta y un identificador de proyecto a un IPC de System V key

  2. Use shmget que asigna un segmento de memoria compartida

  3. Use shmat para adjuntar el segmento de memoria compartida identificado por shmid al espacio de direcciones del proceso de llamada

  4. Hacer las operaciones en el área de memoria

  5. Separar usando shmdt

Estos son incluidos para usar la memoria compartida

#include
#include

int shmid;
int shmkey = 12222;//u can choose it as your choice

int main()
{
  //now your main starting
  shmid = shmget(shmkey,1024,IPC_CREAT);
  // 1024 = your preferred size for share memory
  // IPC_CREAT  its a flag to create shared memory

  //now attach a memory to this share memory
  char *shmpointer = shmat(shmid,NULL);

  //do your work with the shared memory 
  //read -write will be done with the *shmppointer
  //after your work is done deattach the pointer

  shmdt(&shmpointer, NULL);

Comentarios y calificaciones

Recuerda que te brindamos la opción de interpretar si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *