Comment partager la mémoire existante avec shm_open?

Sous Linux, je souhaite partager du contenu mémoire de mon processus avec d’autres processus. l’un des moyens d’y parvenir consiste à utiliser shm_open et mmap. comme ci-dessous.

/* Create a new memory object */ fd = shm_open( "/bolts", O_RDWR | O_CREAT, 0777 ); if( fd == -1 ) { fprintf( stderr, "Open failed:%s\n", strerror( errno ) ); return EXIT_FAILURE; } /* Set the memory object's size */ if( ftruncate( fd, sizeof( *addr ) ) == -1 ) { fprintf( stderr, "ftruncate: %s\n", strerror( errno ) ); return EXIT_FAILURE; } /* Map the memory object */ addr = mmap( 0, sizeof( *addr ), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 ); if( addr == MAP_FAILED ) { fprintf( stderr, "mmap failed: %s\n", strerror( errno ) ); return EXIT_FAILURE; } 

Cependant, de cette manière, je ne peux pas partager la “mémoire déjà allouée”. Ma question est la suivante: puis-je partager le contenu de la mémoire précédemment alloué sans les réaffecter?

Merci d’avance.

Votre code partage la mémoire mais vos deux processus obtiendront des régions d’adresse différentes. Vous voulez avoir la même région, donc la valeur addr sera la même. Dans ce cas, vous pouvez créer des objects dans cette mémoire, utiliser des pointeurs internes et vos objects seront valides et visibles dans les deux processus.

Il existe deux méthodes pour y parvenir.

1) faire fork () pour créer un autre processus

2) Demander à mmap d’allouer de la mémoire à l’adresse spéciale avec MAP_FIXED .

Pour le numéro deux, votre code sera:

 /* Create a new memory object */ fd = shm_open( "/bolts", O_RDWR | O_CREAT, 0777 ); if( fd == -1 ) { fprintf( stderr, "Open failed:%s\n", strerror( errno ) ); return EXIT_FAILURE; } /* Set the memory object's size */ if( ftruncate( fd, sizeof( *addr ) ) == -1 ) { fprintf( stderr, "ftruncate: %s\n", strerror( errno ) ); return EXIT_FAILURE; } // You base address for memory region that you want to share. // Choose this carefully, you both processes MUST have it available! void * baseAddr = 0x7fff00000000; /* Map the memory object */ addr = mmap( baseAddr, sizeof( *addr ), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0 ); if( addr == MAP_FAILED | MAP_FIXED ) { fprintf( stderr, "mmap failed: %s\n", strerror( errno ) ); return EXIT_FAILURE; } 

image