24. týždeň

Testovací scenár 3

Ciele

  1. Oboznámiť sa s pojmom semafory
  2. Naučiť sa pracovať so semaformi
  3. 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:

[_______________] vie prístupovať k semafórom prostredníctvom kľúča. (nominatív singuláru)

Správna odpoveď: Proces
Nesprávna odpoveď

Ú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.

Zdroje

  1. DOTAZNÍK