príznaky sychronizujúca nezávislé na procesoch Správy priznaky struct ipc_perm - 1 -

Podobné dokumenty
Program "Inventúra program.xlsm"

PODPROGRAMY. Vyčlenenie podprogramu a jeho pomenovanie robíme v deklarácii programu a aktiváciu vykonáme volaním podprogramu.

Téma: ÚVOD Man pages, chybový výstup

KOMISNÝ PREDAJ. Obr. 1

Zápis predmetov do AiSu na aktuálny akademický rok

TomTom Referenčná príručka

Dealer Extranet 3. Cenové ponuky

Vytvorenie používateľov a nastavenie prístupov

Hromadná korešpondencia v programe Word Lektor: Ing. Jaroslav Mišovych

Microsoft Outlook. Stručný prehľad základných funkcií. Ing.Anna Grejtáková, SPP DFBERG

To bolo ľahké. Dokážete nakresliť kúsok od prvého stromčeka rovnaký? Asi áno, veď môžete použiť tie isté príkazy.

Užívateľská príručka systému CEHZ. Základné zostavy Farmy podľa druhu činnosti

Tlač do PDF a odosielanie dokladov cez . OBSAH

INTERNET BANKING. Platby cez Internet banking VŠETKO, ČO JE MOŽNÉ. with.vub.sk, Bank of

STRUČNÝ NÁVOD NA OBSLUHU DATALOGERA KIMO KT110 / 150

Pracovné prostredie MS EXCEL 2003.

Kombinatorická pravdepodobnosť (opakovanie)

V nej je potrebné skontrolovať správnosť prenesených a prepočítaných zostatkov z roku 2008.

ALGORITMY A PROGRAMOVANIE VO VÝVOJOVOM PROSTREDÍ LAZARUS. Vývojové prostredie Lazarus, prvý program

DOBROPISY. Dobropisy je potrebné rozlišovať podľa základného rozlíšenia: 1. dodavateľské 2. odberateľské

Kombinatorická pravdepodobnosť (opakovanie)

MANUÁL K TVORBE CVIČENÍ NA ÚLOHY S POROZUMENÍM

MATURITA 2016 ZÁKLADNÉ INFORMÁCIE

Návod k servisnému programu pre fiskálny modul FM2000. manuál. (c)varos

Užívateľská príručka k funkcii Zastavenie a pretočenie obrazu

Funkcia - priradenie (predpis), ktoré každému prvku z množiny D priraďuje práve jeden prvok množiny H.

Dell S2718H/S2718HX/S2718HN/ S2718NX Dell Display Manager Návod na obsluhu

Postup registrácie certifikátov do Windows

DALI, pomoc a riešenia

VECIT 2006 Tento materiál vznikol v rámci projektu, ktorý je spolufinancovaný Európskou úniou. 1/4

Programovanie v jazyku C - to chce dynamiku

Základy - prihlásenie

AIS2 Hodnotenie študentov po skúške POMÔCKA PRE VYUČUJÚCICH

DVDStyler. Získanie programu. Inštalovanie. Začíname tvoriť DVD

VYSPORIADANIE PREHRADENÝCH ZÁVÄZKOV A POHĽADÁVOK

Studentove t-testy. Metódy riešenia matematických úloh

Automatický timer pre DX7 návod na inštaláciu a manuál

Automatické pohony na brány

Manuál študenta. pre odovzdanie záverečnej práce

Prehľad nového TwinSpace

ezakazky Manuál uchádzača

Multihosting Užívateľská príručka

Metóda vetiev a hraníc (Branch and Bound Method)

Programovanie v jazyku C - pole treba poorat...

Modul Kontrolné programy

Hotline - účtovníctvo tel.: 0905/ , denne od 8 00 do HUMANET ÚČTOVNÍCTVO

MATLAB (1) - úvod do programovania vedeckých problémov. LS 2017, 8.predn.

Referenčná ponuka na prístup ku káblovodom a infraštruktúre. Príloha 7 Poplatky a ceny

Predaj cez PC pokladňu

P R O L U C. POZNÁMKY individuálnej účtovnej závierky pre rok 2014

nastavenie a realizácia vzájomných zápočtov v Money S4 / Money S5

Školská sieť EDU. Rozdelenie škôl. Obsah: Deleba škôl podľa času zaradenia do projektu: Delba škôl podľa rýchlosti pripojenia:

Program pre prípravu hromadných príkazov na import do e-banky Prima banka Slovensko, a.s. (ďalej len Prima banka ) Užívateľská príručka

Imagine. Popis prostredia:

Strojový kód, assembler, emulátor počítača

Používateľská príručka pre autorov Prihlásenie

Dodanie tovaru a reťazové obchody Miesto dodania tovaru - 13/1

Príručka na správu systému

Import cenových akcií FRESH

Návod na programovanie inteligentnej elektroinštalácie Ego-n

Používateľská príručka k aplikácii na SOČ

D.Viewer2 Používateľská príručka

Organizačné štruktúry.

Programovanie.NET, C++ - najbližšie termíny:

Import Excel Univerzál

Cez tlačidlo Vyhľadať zvolíte miesto v PC, kde sa HW kľúč nainštaluje. Štandardne je prednastavená inštalácia do priečinka, kde je nainštalovaný progr

Tvorba logického a fyzického dátového modelu relačnej databázy pomocou nástrojov od firmy Oracle výukový tutoriál

KEO - Register obyvateľov Prevod údajov

R11 extremo. Odolný mobilní telefon pro dvě SIM karty. Návod k funkci SOS locator Návod na použitie SOS locator

ONLINE POBOČKA. pre zamestnávateľov MANUÁL

Zoznam zmien: Dátum zverejnenia: Verzia dokumentu: 8. Dátum aktualizácie:

8. Relácia usporiadania

JCDwin - prechod na EURO

Formuláre PowerPoint MGR. LUCIA BUDINSKÁ,

7.CVIČENIE. Základy HTML

Používateľská príručka pre autorov

Postup inštalácie aplikácie Blackberry Connect pre Sony Ericsson P990.

Návod na používanie Centrálnej úradnej elektronickej tabule (CUET)

Operačný systém Úvodná prednáška

s.r.o. HelpLine:

Metodické usmernenie č. 4/2007 k poskytovaniu informácií prostredníctvom portálu Úradu pre dohľad nad zdravotnou starostlivosťou

Meziprocesová komunikace

PLA-401 v3 Ethernetový adaptér PowerLine (prenos dát cez silové elektrické káble)

Certifikát. Prvé kroky s certifikátom na čipovej karte

Blokové a prúdové šifry

SKLADOVÁ INVENTÚRA 1 VYTVORENIE INVENTÚRY. 1.1 Nastavenie skladovej inventúry

Obr. 1 - názov podpísaného súboru/kontajnera v sivej lište

Prevody z pointfree tvaru na pointwise tvar

EDA Klient (príjem výsledkov z oddelení klinickej biochémie a mikrobiológie prostredníctvom internetu)

Čo ak program potrebuje pamäť, ktorej veľkosť závisí od konkrétneho vstupu?

Textový editor WORD. Práca s obrázkami a automatickými tvarmi vo Worde

Test. Ktorý valec by ste použili? A. Jednočinný valec B. Dvojčinný valec. Odpoveď:

eformulár ČSOB Leasing užívateľský manuál verzia 1.0

Virtuálna Registračná Pokladnica. Modul OPD pre ios

Aktualizácia operačného systému Android tabletu Samsung Note 10.1 model N8010

Užívateľská príručka. Vytvorte 1 medzi stránkami v niekoľkých jednoduchých krokoch

Microsoft Project CVIČENIE 6 1

Návod na vkladanie záverečných prác do AIS

Aupark Tower, Einsteinova 24, Bratislava, Slovenská republika / Strana 1 z 5

Podrobný POSTUP na stiahnutie a následnú inštaláciu softwaru HermesFengshui

Transkript:

príznaky sychronizujúca nezávislé na procesoch Správy priznaky struct ipc_perm - 1 -

Téma: Správy Kľúčové slova Ciele Odhadovaný čas Scenár medziprocesová komunikácia, správy Zapamätať si: služby pre prácu so správami rozdielu medzi správami a inými typmi Porozumieť: IPC frontom správ služby na medziprocesovú komunikáciu pomocou správ: vytvorenie frontu správ Aplikovať: poslanie správy výber správy zrušenie frontu správ Vyriešiť typické situácie s posielaním dát medzi procesmi 50 min Sofia sa už stretla s niekoľkými nástrojmi medziprocesovej komunikácie. Chcela by si rozšíriť svoj rozhľad a oboznámiť sa s ďalšími možnosťami, aby sa pri tvorbe svojich programov mohla rozhodnúť pre lepšie a výhodnejšie riešenie. Dnes sa oboznámi so správami ako jeden z mechanizmov medziprocesovej komunikácií. POSTUP: Táto kapitola sa zameriava na: Systémové volania: o msgget() o msgsnd() o msgrcv() o msgctl() - 2 -

Podtéma: Služba jadra - msgget() Kľúčové slová Ciele Odhadovaný čas Scenár msgget() unix, message queue Zapamätať si: argumenty služby a ich syntax Porozumieť: parametru msgflg Aplikovať: túto službu na vytvorenie frontu správ Vyriešiť: tvorbu komplexnejších programov využívajúcich správy na komunikáciu medzi procesmi 10 min Aby mohla Sofia pracovať so správami v programe, musí v prvom rade vytvoriť front týchto správ. KRÁTKY ÚVOD Medzi IPC zaraďujeme aj komunikácia pomocou frontov správ. Správy poskytujú jednoduchý a efektívny spôsob odovzdávania dát medzi dvoma nepríbuznými procesmi. Podobajú sa pomenovaným rúram avšak oproti nim majú tú výhodu, že existujú nezávislé na procesoch odosielateľov a príjemcov. Každý front správ je jedinečne identifikovaný IPC identifikátorom. OS Unix udržuje zoznam identifikátorov frontov správ, ktorého každý prvok zoznamu ukazuje na jednu štruktúru msqid_ds, ktorá plne popisuje jeden front správ. Vždy keď sa proces pokúsi o zápis správy do frontu, porovnajú sa jeho používateľské a skupinové ID s hodnotami v dátovej štruktúre ipc_perm frontu. Pokiaľ proces má právo zápisu do frontu, môže sa správa skopírovať z adresného priestoru procesu do dátovej štruktúry msg, ktorá sa pridá na koniec frontu správ. Čítanie z frontu je podobný procesu zápisu do frontu. Najprv sa opäť kontrolujú prístupové práva k frontu. Proces si môže zvoliť prečítanie prvej správy z frontu bez ohľadu na jej typ, alebo môže vybrať správu podľa určitého typu. Pokiaľ zadaným kritériám nevyhovuje žiadna správa, čitateľ bude presunutý do čakacieho frontu čitateľov a plánovač spustí iný proces. Keď dôjde k zápisu novej správy do frontu, čakajúci proces bude prebudený a znovu spustený. Týmto spôsobom odpadá problém synchronizácie otvárania a zatvárania pomenovaných rúr. Nevýhodou je, že podobne ako u rúr má každý front nastavenú maximálnu veľkosť ako aj limitovaný maximálny počet blokov dát. POSTUP: KROK1 - naučiť sa syntax a sémantiku služby jadra msgget(): Sofia začne so službou jadra msgget(), ktorá jej pomôže získať identifikátor existujúceho alebo vytvoreného front správ. Syntax: #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgget(key_t key, int msgflg); - 3 -

Sémantika: služba msgget() vracia nezápornú celočíselnú hodnotu identifikátor frontu správ alebo pri chybe funkcia vráti hodnotu -1. Pre podrobnejšie informácie Sofia zadá príkaz man 2 msgget KROK2 - pochopiť parametre služby: Parameter key predstavuje kľúč (číslo) pomocou ktorého chceme globálne identifikovať frontu správ v operačnom systéme. V prípade, že takto identifikovaný front správ už existuje, a použité príznaky (flagy) a prístupové práva to dovoľujú, je vrátený identifikátor na tento front správ. V prípade, že žiadny front správ s týmto identifikátorom neexistuje, je vytvorený nový front správ. Existuje špeciálna hodnota kľúča menom IPC_PRIVATE, ktorá vytvorí frontu správ prístupnú len danému procesu (nezohľadní sa kľúč). Druhý parameter msgflg je tvorený príznakmi. Rozoberieme si dve základne príznaky: IPC_CREAT - tento príznak znamená, že chceme vytvoriť frontu správ. Ak je IPC_CREAT použité samostatne, msgget() vracia buď identifikátor pre novovytvorený front správ, alebo identifikátor frontu, ktorý už existuje a ma rovnakú hodnotu kľúča (key). IPC_EXCL - je príznak, ktorý zabezpečí, že pokiaľ je na daný kľúč frontu správ už zaregistrovaný, volanie zlyhá. Používa sa spoločne s príznakom IPC_CREAT. Parameter msgflg obsahuje okrem príznakov aj prístupové práva., ktoré sú používané podobným spôsobom, ako pri vytváraní súborov. Pravdaže tie sa aplikujú len pri vytváraní, ak k nemu dôjde. KROK3 aplikovanie služby v programe: Sofia si prostredníctvom tejto služby vytvorí front správ. Najprv pripojí potrebné hlavičkové súbory: #include <errno.h> #include <stdlib.h> #include <sys/msg.h> #include <stdio.h> Definuje premennú pre uloženie návratovej hodnoty služby msgget(): int main{ int msgid; Následne vytvorí nový front správ. Použije náhodný kľúč (key) a symbolickú konštantu IPC_CREAT. msgid = msgget((key_t)1234, 0666 IPC_CREAT); if (msgid == -1) { fprintf(stderr, "sluzba msgget zlyhala: %d\n", errno); exit(exit_failure); printf("identefikator frontu sprav: %d\n",msgid); exit(exit_success); - 4 -

Sofia v tomto príklade použila na overenie korektnosti vytvoreného frontu správ externú premennú errno, o ktorej sa dozvedela pri prvom stretnutí s programovaním v OS Unix. Skúste použiť príkaz ipcs q ten vám ukáže aktuálny stav vytvorených front správ. KROK4: Aký bol identifikátor frontu správ Vášho programu?: Výstup z programu: $ identefikator frontu sprav:... $ Výstup príkazu ipcs -q: $ ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages 0x000004d2...... 666 0 0-5 -

Podtéma: Služba jadra msgsnd() Kľúčové slová Ciele Odhadovaný čas Scenár msgsnd() unix, message queue Zapamätať si: Porozumieť: Aplikovať: Vyriešiť: 15 min syntax služby niektoré hodnoty jej argumentov Štruktúre správy, parametrom služby msgsnd() túto službu na posielanie správ do frontu posielanie správ do vopred vytvoreného frontu Prvú a najdôležitejšiu časť vytvorenia frontu správ má Sofia za sebou. Teraz sa dozvie, ako môže proces vložiť nejakú správu do tohto frontu, aby si ju potom iný proces mohol vybrať z frontu. POSTUP: KROK1 - naučiť sa syntax a sémantiku služby jadra msgsnd(): Ak Sofia chce poslať správu do frontu správ použije službu msgsnd(). Syntax: int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg); Sémantika: služba msgsnd() po úspešnom vykonaní vráti hodnotu 0 alebo inak -1. Pre podrobnejšie informácie Sofia zadá príkaz man 2 msgsnd. KROK2 - pochopiť parametre služby: Prvý parameter msqid je identifikátor frontu, vytvorený pomocou služby msgget() a asociuje dátovú štruktúru msqid_ds. Parameter msgp ukazuje na užívateľom definovaný buffer. Musíme teda vytvoriť štruktúru správy (menšiu než limit systému) začínajúcu prvkom typu long, ktorý bude použitý ako typ správy pre príjemcu. struct msgbuf { long mtype; //typ správy musí byť > 0 char mtext [N]; //dáta správy ; Tretí parameter msgsz predstavuje dĺžku posielanej správy bez započítania typu správy (veľkosť long mtype). Posledný parameter msgflg nám špecifikuje vykonávanú akciu, ak niektoré z nasledujúcich tvrdení je pravdivé: počet bajtov vo fronte správ je rovný počtu msg_qbytes z msqid_ds štruktúry počet všetkých správ v systéme je rovný systémovému limitu. Príznak IPC_NOWAIT spôsobí, že v prípade prekročenia kapacity frontu služba nebude čakať, ale vráti riadenie programu (návratová hodnota bude 1). Ak ho nepoužijeme, náš proces bude pozastavený do doby, kým nebude možné do frontu zapísať naše dáta. - 6 -

KROK3 aplikovanie služby v programe: Sofia vytvorí program message_snd.c, ktorý bude vkladať správy do frontu. Najprv definuje potrebné hlavičkové súbory, maximálnu dĺžku správy, jej štruktúru a potrebné premenné. Sofia sa dozvedela z manuálových stránok, že správa musí byť menšia ako systémový limit a musí začínať s premennou typu long, ktorá bude použitá v prijímacej službe iného procesu: #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <sys/msg.h> #define MAX_TEXT 512 struct my_msg_st { long int my_msg_type; char some_text[max_text]; ; int main() { int running = 1; struct my_msg_st some_data; int msgid; char buffer[bufsiz]; Sofia vytvorí frontu správ: msgid = msgget((key_t)1234, 0666 IPC_CREAT); if (msgid == -1) { fprintf(stderr, "nepodarilo sa vytvorit frontu: %d\n", errno); exit(exit_failure); Následne v slučke bude vkladať texty do štruktúry správy, ktorá sa pošle. Typ každej správy nastaví na kladné číslo 1. V prípade, že už Sofia nebude chcieť posielať žiadnu správu, napíše reťazec end. Tento reťazec sa vloží do buffra a pošle do frontu správ. Porovná so slovom end. Pri zhode sa program ukončí: while(running) { printf("napis text: "); fgets(buffer, BUFSIZ, stdin); some_data.my_msg_type = 1; strcpy(some_data.some_text, buffer); if (msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0) == -1) { fprintf(stderr, "poslanie zlyhalo\n"); exit(exit_failure); if (strncmp(buffer, "end", 3) == 0) { running = 0; exit(exit_success); - 7 -

Sofia spustí program message_snd, ktorým naplní frontu správ: Príklad: $./message_snd Napis text: Ahoj Napis text: programator Napis text: end Výstup príkazu ipcs -q: $ ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages 0x000004d2 65536 marko 666 1536 3 Služba msgsnd() pošle správu do frontu, ktorá je asociovaná s identifikátorom msqid. Ak je služba skončená úspešne, potom sa niektoré položky v štruktúre msqid_ds zmenia. (táto štruktúra musí byť asociovaná s msqid) Zmeny sú nasledujúce: položka msg_qnum je inkrementovaná o 1. msg_lspid je nastavený na ID volajúceho procesu msg_stime sa nastaví na aktuálny čas. Sofia si preštuduje v manuálových stránkach aké položky obsahuje štruktúra msqid_ds. - 8 -

Podtéma: Služba jadra - msgrcv() Kľúčové slová Ciele Odhadovaný čas Scenár msgrcv() unix, message queue Zapamätať si: Porozumieť: Aplikovať: Vyriešiť: 15 min syntax služby parametrom služby túto službu na získavanie správ z frontu prijímanie správ procesmi v komplexnejších programoch Sofia už vie poslať správu do frontu. Aby ju mohla použiť pre svoj program, potrebuje vybrať túto správu z frontu. Zároveň sa však musí naučiť, ako získať špecifickú správu, teda nie tú, ktorá je vo fronte prvá. POSTUP: KROK1 - naučiť sa syntax a sémantiku služby jadra msgrcv(): Ak Sofia chce vybrať správu z frontu správ použije službu msgsnd(), ktorá správu skopíruje do štruktúry a dáta z frontu správ odstráni. Syntax: ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg); Sémantika: služba msgrcv() po úspešnom vykonaní vráti počet prečítaných bajtov alebo inak -1 Pre podrobnejšie informácie Sofia zadá príkaz man 2 msgrcv. KROK2 - pochopiť parametre služby: Prvý parameter msqid je identifikátor frontu, vytvorený pomocou služby msgget() a asociuje dátovú štruktúru msqid_ds. Parameter msgp ukazuje na užívateľom definovaný buffer. Tretí parameter msgsz predstavuje dĺžku posielanej správy bez započítania typu správy (veľkosť long). Štvrtý parameter msgtyp je priorita pre výber správ z frontu. msgtyp = 0 vezme sa prvá dostupná správa vo fronte. msgtyp > 0 vezme sa správa s typom rovnajúcim sa danému číslu (vhodné pre smerovanie správy, kde napr. msgtyp = PID). msgtyp < 0 vezme sa správa, ktorej typ je rovnaký alebo menší než absolútna hodnota uvedeného čísla (vhodné pre podporu prioritných správ). Posledný parameter msgflg nám špecifikuje vykonávanú akciu. Služba podporuje dva príznaky. Príznak IPC NOWAIT zabraňuje zablokovaniu procesu, keď žiadna správa nie je k dispozícii (služba sa vráti s chybou). Príznak MSG NOERROR naopak zabraňuje chybe, pokiaľ je správa dlhšia než rezervované pamäťové miesto. Služba v tomto prípade správu bez upozornenia skráti. - 9 -

KROK3 aplikovanie služby v programe: Sofia vytvorí program message_rcv.c, ktorý bude súvisieť s predchádzajúcim programom pri službe msgsnd(). Tento nový program bude vyberať a vypisovať všetky správy z frontu, až kým nenarazí na správu end. Sofia najprv pripojí potrebné hlavičkové súbory, definuje štruktúru správy a premenné. Premenná msg_to_receive definuje typ prijímanej správy. Keďže je inicializovaná hodnotou 0, budú sa prijímať zaradom všetky správy vo fronte. #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <sys/msg.h> struct my_msg_st { long int my_msg_type; char some_text[bufsiz]; ; int main() { int running = 1; int msgid; struct my_msg_st some_data; long int msg_to_receive = 0; Teraz otvorí existujúci front správ. msgid = msgget((key_t)1234, 0666 IPC_CREAT); if (msgid == -1) { fprintf(stderr, "nepodarilo sa otvorit frontu sprav: %d\n", errno); exit(exit_failure); Začne vyberať správy z frontu. Na miesto štvrtého parametra zadá 0, teda služba msgrcv() bude čakať na príchod ďalšej správy. Pri úspešnom zavolaní tejto služby návratovou hodnotou bude počet prečítaných bajtov, samotná správa sa zapíše do premennej some_text štruktúry my_msg_st a táto správa sa z frontu vymaže. while(running) { if (msgrcv(msgid,(void*)&some_data,bufsiz,msg_to_receive,0)== -1) { fprintf(stderr, "neuspesne volanie msgrcv: %d\n", errno); exit(exit_failure); printf("napisal si: %s", some_data.some_text); if (strncmp(some_data.some_text, "end", 3) == 0) { running = 0; exit(exit_success); - 10 -

Výstup príkazu ipcs -q: $ ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages 0x000004d2 65536 marko 666 1536 3 Spustením programu message_rcv sa zobrazia všetky správy vo fronte: Príklad: $./message_rcv Napisal si: Ahoj Napisal si: programator Napisal si: end Z týchto príkladov je pre Sofiu jasné, že medziprocesorová komunikácia prostredníctvom správ nie je závislá na synchronizácii procesov (napríklad posielanie signálov), ako tomu bolo pri použití rúr a zdieľanej pamäti. ÚLOHA modifikácia programu Upravte predchádzajúci program tak, aby vypísal iba poslednú správu z frontu. - 11 -

Podtéma: Služba jadra - msgctl() Kľúčové slová Ciele Odhadovaný čas Scenár msgctl() unix, message queue Zapamätať si: Porozumieť: Aplikovať: Vyriešiť: 10 min argumenty služby príznaky špecifikujúce vlastnosti frontu správ štruktúre msqid_ds túto službu na nastavenie frontu správ problémy týkajúce sa informácií o systémových zdrojoch Vytvorenie frontu správ, poslanie, prijatie správy, to všetko Sofia už ovláda. V tejto časti sa naučí, ako front správ zmazať, čo je dôležité pre šetrenie systémových zdrojov, o ktorých sa naučila pri svojich začiatkoch v programovaní v OS Unix. POSTUP: KROK1 - naučiť sa syntax a sémantiku služby jadra msgctl(): Poslednou dôležitou službou, ktorú Sofia potrebuje pri tvorbe programov, je služba msgctl(). Táto služba slúži pre správu a kontrolu frontu správ. Syntax: int msgctl(int msqid, int cmd, struct msqid_ds *buf); Sémantika: služba msgctl() po úspešnom vykonaní vráti hodnotu 0 alebo inak -1. Pre podrobnejšie informácie Sofia zadá príkaz man 2 msgctl. KROK2 - pochopiť parametre služby: Táto služba vykonáva kontrolné operácie špecifikované v parametri cmd nad frontom správ s identifikátorom msqid. Prístupné hodnoty pre cmd sú: IPC_STAT IPC_SET IPC_RMID kopíruje informácie z internej dátovej štruktúry frontu správ asociovanej s msqid do štruktúry, na ktorú ukazuje parameter buf. Napíše hodnotu niektorých členov msqid_ds štruktúry, na ktorú ukazuje parameter buf do dátovej štruktúry frontu správ, aktualizujúc tiež jeho msg_ctime členov. Okamžite odstraňuje front správ a jeho asociovanú dátovú štruktúru. Ako náhle Sofia získa kópiu internej dátovej štruktúry, môže manipulovať s jej členmi. Jedným z modifikovateľných členov je štruktúra ipc_perm. Ten obsahuje práva pre front, ako aj informácie o majiteľovi a tvorcovi. Avšak jediné modifikovateľné členy štruktúry ipc_perm sú mode, uid, a gid. Sofia môže zmeniť ID vlastníka, ID skupiny a prístupové práva pre front. - 12 -

Sofia si preštuduje v manuálových stránkach aké položky obsahuje štruktúra msqid_ds. KROK3 aplikovanie služby v programe: Sofia pokračuje v programe message_rcv.c, ktorý začala v predchádzajúcej podtéme. Prečítala správy z frontu a teraz sa ho pokúsi zmazať. Vie, že na zmazanie frontu správ potrebuje v službe msgctl() použiť kontrolný príznak IPC_RMID na mieste druhého parametra a namiesto tretieho parametra zadá 0. Dôvodom je to, že použila práve príznak IPC_RMID, pri ktorom sa nekopírujú žiadne informácie zo štruktúry vytvorenej systémom a asociovanej s msqid. if (msgctl(msgid, IPC_RMID, 0) == -1) { fprintf(stderr, "msgctl(ipc_rmid) failed\n"); exit(exit_failure); ÚLOHY NA SAMOSTATNÚ PRÁCU: Čo nám zaručuje súbežné použitie príznakov IPC_EXCL a IPC_CREAT? Implementujte príznak IPC_EXCL do predchádzajúceho príkladu a dvakrát za sebou spustite tento program (bez akýchkoľvek zmien) Aký identifikátor vám vráti pri druhom spustením? Vytvorte front správ, ku ktorej bude mať iba prístup jej vlastník. Vytvorte program, ktorý sa pokúsi zapísať do frontu väčšiu správu ako je jej kapacita. Vytvorte program, v ktorom hlavný proces vytvorí dva podriadené procesy. Jeden z týchto podriadených procesov (potomok 1) bude do frontu zapisovať 5 správ, druhý podriadený proces (potomok 2) ich bude vyberať a vypisovať. Vytvorte program, ktorému budú predané dva parametre - dve čísla. Hlavný proces naplní frontu správ desiatimi správami s poradovými číslami (od 1), pričom každá z nich je v tvare "Sprava <poradove_cislo>.". Podriadený proces (potomok) potom na základe dvoch čísel predaných hlavnému programu ako argumenty vypíše dané správy. - 13 -