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 mmap
ya 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 :
-
Use ftok para convertir un nombre de ruta y un identificador de proyecto a un IPC de System V key
-
Use shmget que asigna un segmento de memoria compartida
-
Use shmat para adjuntar el segmento de memoria compartida identificado por shmid al espacio de direcciones del proceso de llamada
-
Hacer las operaciones en el área de memoria
-
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ó.