Programación concurrente en Linux

# Semáforos en Linux

Como otros muchos mecanismos, las primitivas sobre semáforos han ido evolucionando en UNIX/Linux a través de las diferentes versiones. A partir de la versión del kernel 2.6, Linux soporta semáforos POSIX como se describe a continuación. Más detalles podrás encontrarlos en la página `sem_overview(7)` y otras relacionadas.

Hay dos tipos de semáforos en Linux: sin nombre y con nombre (¡esto no es nuevo!). Sobre ambos tipos se utiliza la misma pareja de primitivas con la funcionalidad de bajar/subir: `sem_wait(3)` y `sem_post(3)`. La diferencia reside en el ámbito de utilización.

Los semáforos sin nombre están pensados para usarse por un conjunto de hilos en el ámbito de un proceso (aunque también pueden usarse entre procesos). Por eso no necesitan nombre, ya que `sem_wait` y `sem_post`, así como la primitiva de inicialización `sem_init(3)`, utilizan directamente la variable con la que habremos definido el semáforo en el proceso.

Los semáforos con nombre son adecuados para cuando queremos coordinar un conjunto de procesos (aunque también pueden usarse entre hilos). El nombre del semáforo es global (de hecho, está en el sistema e ficheros). Al igual que hacemos con los ficheros, los procesos que lo usan tienen que abrirlo para obtener un descriptor del semáforo, que es el identificador que luego usarán `sem_wait` y `sem_post`. A diferencia de los sin nombre, estos semáforos son persistentes, es decir, su ámbito de vida trasciende al de los procesos que los usan, exactamente igual que ocurre con los ficheros.