Ciele
- Oboznámiť sa s pojmom semafory
- Naučiť sa pracovať so semaformi
- Po prejdení scenára prosím vyplnte dotazník
Postup
Krok 1: Semafory
Príprava
Pre prácu na cvičení si stiahnite súbor k cvičeniu.
Obsah súboru:
.
└── 10
├──u1_1.c
├──Makefile
└──tests
└──u1_1_test.sh
Úvod
Semafor je dátová štruktúra, ktorá pomáha vláknam spolupracovať bez toho aby sa navzájom obmedzovali. Nadobúda povolené hodnoty od 0 po max(integer). Je to pasívny synchronizačný nástroj. Synchronizáciu zabezpečujú dve neprerušiteľné operácie P a V (buď sa vykoná celá naraz, alebo sa nevykoná vôbec).
Úloha 1.1
Podrobnejšie informácie nájdete v manuáli man sem_overview.
Krok 2: Práca so semaformi
Služba jadra semget()
Služba jadra semget() vytvorí novú sadu semaforov a vráti ich identifikátor. Semaforová sada je určitý počet semaforov, ktorý je identifikovaný unikátnym identifikátorom.
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget (key_t key, int num_sems, int sem_flags);
Parametre | |
---|---|
key_t key | celočíselná hodnota, ktorá umožnuje nezávislým procesom pristupovať k rovnakej sade semaforov |
int num_sems | počet semaforov v sade |
int sem_flags | špecifikuje prístupové práva k sade semaforov, ktoré fungujú ako prístupové práva k súboru |
Návratová hodnota | |
---|---|
v prípade úspešného vykonania vráti identifikátor vytvorenej sady semaforov | |
v prípade neúspešného vykonania vráti -1 |
Príznaky | |
---|---|
IPC_CREAT | Zaistí vytvorenie novej sady semaforov, ak ešte neexistuje |
IPC_EXCL | Zobrazí chybové hlásanie ak sada už existuje |
IPC_PRIVATE | Zaistí vytvorenie novej sady semaforov, ku ktorej môže pristupovať iba proces ktorý ju vytvoril |
Poznámka
Príznaky sa zadávajú namiesto parametra int sem_flags.
Príklad použitia:
#define _POSIX_SOURCE
#define _SVID_SOURCE
#include <stdio.h>
#include <sys/sem.h>
int main(void) {
int sem1 , sem2, sem3;
key_t ipc_key;
ipc_key = ftok(".", 'S');
if((sem1 = semget (ipc_key, 3, IPC_CREAT | 0666))==-1){
perror("semget: IPC_CREAT | 0666");
}
printf("sem1 identifikator: %d\n", sem1);
if((sem2 = semget(ipc_key, 3, IPC_CREAT| IPC_EXCL| 0666)) ==-1){
perror("semget: IPC_CREAT | IPC_EXCL | 0666");
}
printf("sem2 identifikator: %d\n", sem2);
if((sem3 = semget(IPC_PRIVATE, 3, 0666)) == -1){
perror("semget: IPC_PRIVATE");
}
printf("sem3 identifikator: %d\n", sem3);
return 0;
}
Opis kódu:
V hlavnom programe je najprv získaný prostredníctvom služby ftok() unikátny identifikátor pre danú kombináciu pathname a proj_id. Tak je vytvorená sada semafórov službou semget() a do premennej sem1 je uložený identifikátor na túto sadu semafórov. Následne je demonštrovaný prípad neúspešného vytvorenia sady. V tomto prípade je do premennej sem2 uložená hodnota -1, čo značí chybu. Ku chybe došlo z dôvodu využitia príznaku IPC_EXCL, ktorý je popísaný vyššie. Pri vytváraní sady semafórov, ktorej identifikátor je uložený do premennej sem3, je použitý príznak IPC_PRIVATE vďaka ktorému je sada prístupná len procesu, ktorý ju vytvoril.
Úloha 2.1
Preštudujte si v manuáli službu semget(). Aký chybový výstup bude mať služba semget() ak použijeme príznaky IPC_CREAT a IPC_EXCL, a sada semaforov pre daný kľúč už existuje:
Úloha 2.2
Vytvorte sadu semafórov. Ako kľúč použite hodnotu získanú prostredníctvom služby ftok s použitím parametramov "." a 'D'. Prístupové práva k sade semafórov nastavte na 0666. Program nech vytvorí sadu semafórov, ak ešte nebola vytvorená. V prípade, že sada semafórov už existuje tak dôjde ku chybe.