Comunicación entre Procesos
Memoria Compartida y Semáforos POSIX

Algo de historia: Unix System V parte el año 1983 y varias versiones se crearon. La versión más exitosa fue la 4, SVR4 (System V Release 4). Esta versión de Unix incluyó los mecanismos de comunicación entre procesos que hoy se conocen como System V IPC. Posteriormente POSIX "Portable Operating System Interface" estandariza los mecanismos de IPC y crea otra API para IPC. Como SVR4 fue muy difundida y está presente en muchos sistemas actuales, POSIX incluye también el API de IPC de SVR4.

  En esta página se describe la API de POSIX posterior a SVR4 por mayor simplicidad y mejor diseño de su interfaz comparada con los llamados. Visite este material para estudiar los llamados del sistema SVR4.

Algunas estructuras de datos son creadas globalmente en el sistema, el cual no maneja un contador de referencias. La estructura permanece en el sistema hasta que es removida por un proceso o la máquina es "rebooted". (Parecido a procesos zombies). En caso de ser necesario, con los comandos ipcs e ipcrm se puede listar y remover estos mecanismos de comunicación entre procesos. 


  Memoria Compartida en POSIX
  POSIX define un API con las siguientes funciones:
    shm_open(3): crea y abre un objeto de memoria compartida nuevo, o abre una objeto existente. Es análogo a open(2).  El valor retornado es un descriptor de archivo para ser usado en los otros llamados del API.
    ftruncate(2)   Fija el tamaño del objeto de memoria compartida.  Objetos recien creados de memoria compartida tienen largo cero.
    Los dos llamados previos en su conjunto cumplen funcionalidad similar a shmget.

    mmap(2)       Mapea el objeto de memoria compartida en el espacio de direcciones virtuales del proceso llamador. Este llamado se puede considerar análogo a shmat.
    munmap(2)    Desmapea el objeto de memoria compartida del espacio de direcciones del proceso llamador.
Este llamado se puede considerar análogo a shmdt.
    shm_unlink(3)  Remueve el segmento de memoria compartida del sistema de archivos (es una visión lógica, no en disco).
    close(2)       Cierra el descriptor de archivo retornado por shm_open(3). El proceso hace este llamado cuando deja de necesitar el descriptor.
    fstat(2)       Obtiene el estado del segmento de memoria compartida. Entre la información retornada está: el tamaño del objeto, sus permisos, dueño y grupo.
    fchown(2)      Para cambiar el dueño del segmento de memoria compartida.
    fchmod(2)      Para cambiar los permisos del objeto de memoria compartida.

Ver ejemplos aquí: Se trata de un sistema productor-consumidor sin mecanismos de sincronización.


Semáforos en POSIX
Si bien POSIX define un conjunto de llamados para manejar semáforos, su implentación no está tan difundida como aquella de SVR4 presentada arriba. De man sem_overview se tiene:"System  V  semaphores (semget(2), semop(2), etc.) are an older semaphore API.  POSIX semaphores provide a simpler, and better designed interface than System V semaphores; on the other hand POSIX semaphores are less widely available (especially on older systems) than System V semaphores."

POSIX define un API para el manejo de semáforos para mayor información revisar páginas man de: sem_close(3), sem_destroy(3), sem_getvalue(3), sem_init(3), sem_open(3), sem_post(3), sem_unlink(3),
       sem_wait(3).
POSIX permite crear dos tipos de semáforos: semáforos con nombre y sin nombre. Los primeros pueden ser usados entre varios proceso usando el mismo nombre en el llamado a sem_open.

Vea este ejemplo productor consumidor empleando memoria compartida y semáforos POSIX.