165 votes

Comment utiliser la mémoire partagée avec Linux en C

J'ai un peu d'un problème avec un de mes projets.

J'ai essayé de trouver un bien documentés exemple d'utilisation de la mémoire partagée avec fork() mais sans succès.

Fondamentalement, le scénario est que lorsque l'utilisateur lance le programme, j'ai besoin de stocker deux valeurs dans la mémoire partagée: current_path qui est un char* et un nom de fichier qui est aussi char*.

Selon les arguments de la commande, un nouveau processus a démarré avec fork() et que le processus a besoin de lire et de modifier le current_path variable stockée dans la mémoire partagée, tandis que le nom de fichier variable est en lecture seule.

Est-il un bon tutoriel sur la mémoire partagée avec un exemple de code (si possible) que vous pouvez m'indiquer?

Merci, bleepzter

242voto

uʍop ǝpısdn Points 16540

La page de manuel de shmget contient à peu près tout ce dont vous avez besoin pour commencer.

Sinon, vous avez ici une explication avec des exemples.

L'approche shmget est cependant un peu dépassée. Utiliser mmap accompagner d'autres installations est une approche plus intelligente.

34voto

Mayank Points 321

Voici un exemple de mémoire partagée. Cela pourrait aider:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

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

int main(int argc, char *argv[])
{
    key_t key;
    int shmid;
    char *data;
    int mode;

    if (argc > 2) {
        fprintf(stderr, "usage: shmdemo [data_to_write]\n");
        exit(1);
    }

    /* make the key: */
    if ((key = ftok("hello.txt", 'R')) == -1) /*Here the file must exist */ 
{
        perror("ftok");
        exit(1);
    }

    /*  create the segment: */
    if ((shmid = shmget(key, SHM_SIZE, 0644 | IPC_CREAT)) == -1) {
        perror("shmget");
        exit(1);
    }

    /* attach to the segment to get a pointer to it: */
    data = shmat(shmid, (void *)0, 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;
}
 

Étapes: 1- Utilisez ftok pour convertir un chemin d'accès et un identifiant de projet en une clé IPC System V

2- Utilisez shmget qui alloue un segment de mémoire partagée

3- Utilisez shmat pour attacher le segment de mémoire partagée identifié par shmid à l'espace d'adressage du processus appelant

4- Effectuez les opérations sur la zone mémoire

5- Détachez en utilisant shmdt

14voto

Bharat Points 17

Ce sont inclus pour l'utilisation de la mémoire partagée

 #include<sys/ipc.h>
#include<sys/shm.h>

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);
 

9voto

sl0815 Points 416

Le chapitre 5 du livre "Programmation Linux avancée" a une belle introduction à IPC avec Linux (livre entier en pdf)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X