Mecanismos de comunicación entre procesos (II)

9 Abr

Los mecanismos IPC del Unix System V (semáforos para sincronizar, memoria compartida y colas de mensajes) están implementados como una unidad y, por tanto, comparten características comunes de tal forma que, cada mecanismo dispone de una función:

  • get para crear o recuperar uno de estos elementos de comunicación (por ejemplo, para C, shmget, semget, msgget)
  • de control que permite leer y modificar el estado del elemento.

Existen más características que se pueden consultar en la documentación referenciada. Existen, además, 2 utilidades que nos permiten, desde el shell, obtener información y controlar los mecanismos usados en un sistema GNU/Linux concreto: ipcs e ipcrm. El primero sirve para saber los IPCs asignados junto con cierta información. El segundo permite borrarlos. Para saber más sobre ellos: man ipcs o man ipcrm.

Shared Memory

Quizás sea la forma más rápida de comunicar 2 procesos ya que para ello, solo debemos escribir en la zona de memoria compartida por ambos. Para poder utilizar este mecanismo, tenemos las funciones (en C):

  • shmget para crear (o habilitar si ya lo está) una zona de memoria
  • shmctl para acceder y modificar la información administrativa y de control asociada a la memoria
  • shmat para asociar una zona de memoria a un proceso
  • shmdt para desasociar la memoria del proceso

Para sincronizar el acceso a la memoria compartida entre distintos procesos debemos usar un mecanismo de sincronización: semáforos.

Ejemplo de uso

 int segment_id;
 char* shared_memory;
 struct shmid_ds shmbuffer;
 int segment_size;
 const int shared_segment_size = 0x6400;
 
 /* Allocate a shared memory segment. */
 segment_id = shmget (IPC_PRIVATE, shared_segment_size, IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
 /* Attach the shared memory segment. */
 shared_memory = (char*) shmat (segment_id, 0, 0);
 printf ("shared memory attached at address %pn"€, shared_memory);
 /* Determine the segment'™s size. */
 shmctl (segment_id, IPC_STAT, &shmbuffer);
 segment_size = shmbuffer.shm_segsz;
 printf ("€œsegment size: %dn"€, segment_size);
 /* Write a string to the shared memory segment. */
 sprintf (shared_memory, "€œHello, world"€);
 /* Detach the shared memory segment. */
 shmdt (shared_memory);
 /* Reattach the shared memory segment, at a different address. */
 shared_memory = (char*) shmat (segment_id, (void*) 0x5000000, 0);
 printf ("shared memory reattached at address %pn"€, shared_memory);
 /* Print out the string from shared memory. */
 printf ("€œ%sn"€, shared_memory);
 /* Detach the shared memory segment. */
 shmdt (shared_memory);
 /* Deallocate the shared memory segment.
 shmctl (segment_id, IPC_RMID, 0);

Referencias:

  1. Advanced Linux Programming, de Mark Mitchell, Jeffrey Oldham y Alex Samuel
  2. Unix Programación avanzada, Fco. Manuel Márquez García
  3. Para Python: https://docs.python.org/2/library/multiprocessing.html

One thought on “Mecanismos de comunicación entre procesos (II)

  1. Pingback: Mecanismos de comunicación entre procesos (III) | Mundo errante

Comments are closed.