Semáforos POSIX con programación en C

Posix Semaphores With C Programming



POSIX se refiere a la interfaz portátil del sistema operativo, que es un estándar IEEE, desarrollado para ayudar a la portabilidad de diferentes aplicaciones. POSIX es un esfuerzo por construir una versión estandarizada común de UNIX a través de la colaboración de proveedores. Facilitaría la migración de aplicaciones entre plataformas de hardware si fueran efectivas. Hewlett-Packard está integrando POSIX en su versión 5.0 del sistema operativo MPE / iX con licencia y la versión 10.0 de HP / UXX, respectivamente (su UNIX).

El estándar POSIX tiene mucho más de diez partes, sin embargo, dos se pueden obtener fácilmente. POSIX.1 describe interfaces de programación C (es decir, una biblioteca de llamadas al sistema) para archivos, procedimientos y terminales de E / S. La biblioteca de paquetes C POSIX para plataformas POSIX es un marco de la biblioteca estándar C. Esto se establece al mismo tiempo que el estándar ANSI C. Para hacer que POSIX sea compatible con el estándar C, se han realizado varios intentos. POSIX proporciona características adicionales a las implementadas en el estándar C.







Semáforos POSIX

Un semáforo es una estructura de datos que se utiliza a menudo para sincronizar los procesos y ayudar a los subprocesos sin que interactúen entre sí para que funcionen juntos. La interfaz para semáforos está especificada por el estándar POSIX. No es parte de Pthreads. Sin embargo, la mayoría de los UNIX que admiten Pthreads incluso proporcionan semáforos. En marcos similares a Unix, como Linux, los semáforos se combinan con colas de mensajes y memoria común debajo de los servicios de comunicación entre procesos (IPC). Los semáforos de framework V más antiguos y los semáforos POSIX modernos se convierten en dos tipos de semáforos. Las llamadas a POSIX Semaphore son mucho más fáciles que las llamadas a System V Semaphore. Aunque, los semáforos de System V son más fáciles de obtener, especialmente en plataformas anteriores tipo Unix. Es necesario conectar programas que utilicen semáforos POSIX a la biblioteca Pthread. Echaremos un vistazo a los semáforos POSIX en este artículo.



¿Por qué POSIX Semaphores?

Existe un gran problema en torno a los subprocesos, que es la condición de carrera. Es una circunstancia en la que dos hilos buscan obtener y alterar la misma información, convirtiéndola en conflictiva. Para evitar una condición de carrera, hemos estado usando semáforos durante mucho tiempo.



Los semáforos están disponibles en 2 tipos:





Semáforo binario :

También se reconoce como bloqueo mutex. Solo tendría dos valores posibles, 0 y 1. El valor se inicializará como 1. Se está utilizando para hacer cumplir numerosos procesos para resolver el problema de la sección grave.



Contando semáforo :

Su tamaño puede variar en un dominio sin restricciones. Se está utilizando para tener autoridad sobre el acceso a recursos de numerosas instancias.

El marco POSIX de Linux tiene su repositorio Semaphore integrado. Para usarlo debemos:

  • Agregar semaphore.h
  • Apila el código conectando con -lpthread -lrt.

Casi todos los métodos y formas de POSIX Semaphore son prototipos o se especifican en 'Semaphore.h'. Usaremos el semáforo para describir una entidad u objeto como:

>>sem_t sem_name;

Aquí hay diferentes funciones que usaríamos en POSIX Semaphore.

Sem_init

Para inicializar un semáforo, debe utilizar el método sem_init. En esta función, sem corresponde a un objeto semáforo inicializado. Pshared es un banner o bandera que especifica si el semáforo se puede compartir con un procedimiento bifurcado () o no. Los semáforos compartidos no están actualmente reforzados por LinuxThreads. El valor del argumento es el valor inicial en el que se fija el semáforo.

>> En tsem_init(sem_t*sem, En tpshared, no firmado En tvalor);

Sem_wait

Usaremos el método sem-wait para mantener / bloquear un semáforo o hacerlo esperar. Si el semáforo tiene un valor negativo, el ciclo de llamada se bloqueará automáticamente. Siempre que cualquier otro hilo llame a sem_post, uno de los procesos ya obstruidos se despierta.

>> En tsem_wait(sem_t*sem);

Sem_post

Usaremos el método sem_post para aumentar el valor de un semáforo. Al llamar, sem_post incrementará el valor y uno de los procesos ya obstruidos o en espera se despierta.

>> En tsem_post(sem_t*sem);

Sem_getvalue

Si desea conocer el valor de un semáforo, debe utilizar la función sem_getvalue a continuación. Obtendrá el valor presente del semáforo y se colocará en el destino valp-apuntado.

>>Int sem_getvalue(sem_t*sem, En t *cachorro);

Sem_destroy

Debería utilizar el método sem_destroy si desea destruir el semáforo. Si se va a producir la desaparición del semáforo, no habrá ningún hilo esperando en el semáforo.

>>Int sem_destroy(sem_t*sem);

Instale la utilidad GCC

Para compilar el código POSIX Semaphore C, debe tener la utilidad gcc instalada en su sistema Linux. Para este propósito, abra su terminal de comando y pruebe el siguiente comando.

$sudo apt-get install gcc

Afirma tu acción golpeando Y .

Implementación de POSIX Semaphore con programación C en Ubuntu

Al principio, debe crear un nuevo archivo con una extensión .cpp en el sistema Ubuntu 20.04. Para ello, debe navegar hacia su directorio de inicio y crear un nuevo archivo vacío llamado new.cpp. También puede crearlo usando el comando táctil en su terminal de comando.

Puede ver que el archivo new.cpp se ha creado en el directorio de inicio.


Después de la creación del archivo .cpp, ábralo como un editor de texto en su sistema Linux y escriba el siguiente código en este archivo tal como está. Después de eso, guárdelo y ciérrelo.

Ejecute el programa POSIX Semaphore C en Ubuntu 20.04

Abra su terminal en Ubuntu 20.04 y ejecute el siguiente comando gcc seguido del nombre del archivo.

$gccnombrearchivo.c –lpthread –lrt

Hay 2 hilos formados, uno se forma después de 2 segundos del otro. Después de recibir el perno, el primer hilo duerme durante 4 segundos. Entonces, después de que se haya llamado, el segundo hilo no se unirá directamente, y aparecerá 4-2 = 2 segundos después de que se haya llamado. Aquí está el resultado:

Si no hubiéramos usado semáforo, de acuerdo con el cambio de contexto, el resultado podría haber sido como se observa:

Conclusión

En esta guía, se ofrece una descripción detallada del uso de POSIXSemaphore con programación C en Ubuntu 20. Simplemente usando la biblioteca POSIX o Pthread en cierto código C, POSIX Semaphore se puede usar con bastante facilidad para evitar condiciones de carrera durante la codificación.