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:
- Advanced Linux Programming, de Mark Mitchell, Jeffrey Oldham y Alex Samuel
- Unix Programación avanzada, Fco. Manuel Márquez García
- Para Python: https://docs.python.org/2/library/multiprocessing.html