POSIX семафори с C програмиране

Posix Semaphores With C Programming



POSIX се отнася до преносимия интерфейс на операционната система, който е IEEE стандарт, разработен за подпомагане преносимостта на различни приложения. POSIX е опит за изграждане на обща стандартизирана версия на UNIX чрез сътрудничество на доставчици. Това би улеснило пренасянето на приложения между хардуерни платформи, ако са ефективни. Hewlett-Packard интегрира POSIX в своята лицензирана MPE/iX OS версия 5.0 и HP/UXX версия 10.0, съответно (нейният UNIX).

Стандартът POSIX има много повече от десет части, но две лесно се получават. POSIX.1 описва интерфейси за програмиране на C (т.е. библиотека за системни повиквания) за файлове, процедури и I/O терминали. Пакетната библиотека C POSIX за POSIX платформи е рамка на стандартната библиотека C. Това се установява едновременно със стандартния ANSI C. За да се направи POSIX съвместим със стандарт C, са направени няколко опита. POSIX предоставя допълнителни функции на тези, внедрени в стандарт C.







POSIX Семафори

Семафорът е структура от данни, често използвана за синхронизиране на процесите и подпомагане на нишки, без тяхното взаимодействие помежду си да работят заедно. Интерфейсът за семафори е определен от стандарта POSIX. Не е част от Pthreads. Въпреки това, повечето UNIX, които поддържат Pthreads, дори предоставят семафори. В Unix-подобни рамки, като Linux, семафорите се сливат с опашки за съобщения и обща памет под услугите за междупроцесна комуникация (IPC). По -старите рамкови V семафори и съвременните POSIX семафори се превръщат в два вида семафори. POSIX Semaphore обажданията са много по -лесни от System V Semaphore повикванията. Въпреки това, семафорите на System V са по-лесни за получаване, особено на по-ранните Unix-подобни платформи. Необходимо е да се свържат програми, използващи POSIX семафори, към библиотеката Pthread. Ще разгледаме семафорите POSIX в тази статия.



Защо POSIX семафори?

Има голям проблем около нишките, което е състезателно състояние. Това е обстоятелство, при което две нишки се стремят да получат и променят една и съща информация, като по този начин я правят конфликтна. За да избегнем условията на състезание, използвахме семафори от много дълго време.



Семафорите се предлагат в 2 вида:





Двоичен семафор :

Той също така се разпознава като заключване на mutex. Той ще има само две възможни стойности, 0 и 1. Стойността ще бъде инициализирана като 1. Използва се за налагане на множество процеси за решаване на сериозния проблем с раздел.



Преброяване на Семафор :

Размерът му може да варира в неограничен домейн. Използва се, за да има власт над достъпа до многобройни ресурси.

Рамката на Linux POSIX има интегрирано хранилище на Semaphore. За да го използваме, трябва:

  • Добавете semaphore.h
  • Натрупайте кода, като се свържете с -lpthread -lrt.

Почти всички методи и форми на POSIX Semaphore са прототипирани или посочени в „Semaphore.h“. Ще използваме Semaphore, за да опишем обект или обект като:

>>sem_t sem_name;

Ето различни функции, които бихме използвали в POSIX Semaphore.

Sem_init

За да инициализирате семафор, трябва да използвате метода sem_init. В тази функция sem съответства на инициализиран семафор обект. Pshared е банер или флаг, който определя дали семафорът може да бъде споделен с процедура forked () или не. Споделените семафори понастоящем не се поддържат от LinuxThreads. Стойността на аргумента е началната стойност, при която семафорът е фиксиран.

>> intsem_init(sem_t*sem, intпшаред, без подпис intстойност);

Sem_wait

Ще използваме метода sem-wait за задържане/заключване на семафор или го накараме да изчака. Ако на семафора е предоставена отрицателна стойност, цикълът на повикване ще бъде автоматично блокиран. Всеки път, когато друга нишка извика sem_post, се активира един от вече запушените процеси.

>> intsem_wait(sem_t*sem);

Sem_post

Ще използваме метода sem_post, за да увеличим стойността на семафор. При извикване, sem_post ще увеличи стойността и се активира един от вече запушените или чакащи процеси.

>> intsem_post(sem_t*sem);

Sem_getvalue

Ако искате да знаете за стойността на семафор, трябва да използвате функцията sem_getvalue по -долу. Той ще получи настоящата стойност на семафора и ще бъде поставен в дестинацията, насочена към valp.

>>Int sem_getvalue(sem_t*sem, int *кученце);

Sem_destroy

Трябва да използвате метода sem_destroy, ако искате да унищожите семафора. Ако смъртта на семафора трябва да продължи, нишка няма да чака в семафора.

>>Int sem_destroy(sem_t*sem);

Инсталирайте помощната програма GCC

За да компилирате кода на POSIX Semaphore C, трябва да имате инсталирана помощната програма gcc във вашата Linux система. За тази цел отворете командния терминал и опитайте командата по -долу.

$sudo apt-get install gcc

Потвърдете действието си, като натиснете И .

Внедряване на POSIX Semaphore с C програмиране в Ubuntu

В самото начало трябва да създадете нов файл с разширение .cpp в системата Ubuntu 20.04. За да направите това, трябва да се придвижите към домашния указател и да създадете нов празен файл с име new.cpp. Можете също да го създадете с помощта на командата за докосване в командния терминал.

Можете да видите, че файлът new.cpp е създаден в домашната директория.


След създаването на .cpp файла, отворете го като текстов редактор във вашата Linux система и напишете кода по -долу в този файл такъв, какъвто е. След това го запазете и затворете.

Изпълнете програмата POSIX Semaphore C в Ubuntu 20.04

Отворете терминала си в Ubuntu 20.04 и изпълнете командата gcc по -долу, последвана от името на файла.

$gccfilename.c –lpthread –lrt

Образувани са 2 нишки, едната се формира след 2 секунди от другата. След получаване на болта, първата нишка спи за 4 секунди. Така че, след като е извикана, втората нишка няма да се присъедини директно и това ще се появи 4-2 = 2 секунди след като е била извикана. Ето изхода:

Ако не бяхме използвали семафор, според превключването на контекста, резултатът можеше да бъде както се наблюдава:

Заключение

В това ръководство е даден подробен преглед на използването на POSIXSemaphore с C програмиране в Ubuntu 20. Чрез просто използване на библиотеката POSIX или Pthread в определен C код, POSIX Semaphore може да се използва доста лесно за предотвратяване на условията на състезанието по време на кодирането.