Tengo un pequeño problema con uno de mis proyectos.
He estado tratando de encontrar un ejemplo bien documentado de uso de memoria compartida con fork()
pero sin éxito.
Básicamente, el escenario es que cuando el usuario inicia el programa, necesito almacenar dos valores en la memoria compartida: current_path que es un char * y un file_name que también es char * .
Dependiendo de los argumentos del comando, se inicia un nuevo proceso fork()
y ese proceso necesita leer y modificar la variable current_path almacenada en la memoria compartida, mientras que la variable file_name es de solo lectura.
¿Existe un buen tutorial sobre memoria compartida con código de ejemplo (si es posible) al que me pueda dirigir?
c
linux
fork
shared-memory
bleepzter
fuente
fuente
shmget()
et al. y también elmmap()
enfoque puro conMAP_ANON
(también conocido comoMAP_ANONYMOUS
), aunqueMAP_ANON
POSIX no lo define. También existe POSIXshm_open()
yshm_close()
para la gestión de objetos de memoria compartida. [… Continúa…]shm_unlink()
), mientras que los mecanismos que usanmmap()
requieren un archivo yMAP_SHARED
persistir los datos (yMAP_ANON
excluye la persistencia). Hay un ejemplo completo en la sección Justificación de la especificación deshm_open()
.Respuestas:
Hay dos enfoques:
shmget
ymmap
. Hablaré de élmmap
, ya que es más moderno y flexible, pero puede echar un vistazoman shmget
( o este tutorial ) si prefiere usar las herramientas de estilo antiguo.La
mmap()
función se puede utilizar para asignar búferes de memoria con parámetros altamente personalizables para controlar el acceso y los permisos, y 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:
El siguiente es un programa de ejemplo que usa la función definida anteriormente para asignar un búfer. El proceso padre escribirá un mensaje, se bifurcará y luego esperará a que su hijo modifique el búfer. Ambos procesos pueden leer y escribir la memoria compartida.
fuente
shmget
es una forma realmente anticuada, y algunos dirían obsoleta, de hacer memoria compartida ... Es mejor usarmmap
yshm_open
, archivos sin formato, o simplementeMAP_ANONYMOUS
.A continuación, se muestra un ejemplo de memoria compartida:
Pasos:
Utilice ftok para convertir un nombre de ruta y un identificador de proyecto en una clave de IPC de System V
Utilice shmget que asigna un segmento de memoria compartida
Utilice shmat para adjuntar el segmento de memoria compartida identificado por shmid al espacio de direcciones del proceso de llamada
Realice las operaciones en el área de memoria
Separar usando shmdt
fuente
Estos se incluyen para usar la memoria compartida
fuente
prueba este ejemplo de código, lo probé, fuente: http://www.makelinux.net/alp/035
fuente
shmget
yshmat
desde un proceso diferente), que es una especie de punto completo de la memoria compartida ... = (Aquí hay un ejemplo de mmap:
fuente
open
agrega gastos generales de E / S de archivos. Úselo en sushm_open
lugar.