Moje odkazy
vydáno: 7. 4. 2009 12:15, aktualizováno: 22. 4. 2019 17:07
V operačních systémech odpovídajících standardu POSIX jako je např. GNU/Linux nebo Mac OS máme k dispozici systém front. Jedná se o něco podobného jako JMS, ale na nižší (systémové) úrovni. Tato technologie nám umožňuje vytvářet pojmenované fronty (názvy začínají lomítkem). Do těchto front můžeme posílat zprávy a následně je z fronty vybírat. Fronty jsou tak použitelné pro asynchronní meziprocesovou komunikaci (IPC).
Fronty nejsou trvanlivé, při ukončení operačního systému se nám ztratí jak nevybrané zprávy, tak samotné fronty. Komunikace pomocí těchto zpráv je omezena na jeden počítač.
Jedním z důležitých parametrů při vytváření fronty je její velikost – počet zpráv, které se do ní vejdou. Komunikace pomocí zpráv je sice asynchronní, ale při pokusu o přidání zprávy do zaplněné fronty dojde k zablokování (v případě fronty v blokujícím režimu), až do chvíle, dokud se fronta zase neuvolní (jiný proces z ní nějakou zprávu nevybere).
Zprávy se doručují v první řadě podle priority a v rámci stejné priority podle stáří (FIFO).
Napsal jsem jednoduchý program v jazyce C++, pomocí kterého můžete odesílat a přijímat zprávy. Program je svobodný software (GPL) a zdrojové kódy si můžete stáhnout z mého mercurialu (návod).
Program pracuje buď v režimu přijímání zpráv nebo odesílání. Název fronty (/mojeFronta
), je zatím nastaven napevno ve zdrojovém kódu.
Fronty si můžeme připojit jako souborový systém. Pomocí příkazů:
mkdir /dev/mqueue/
mount -t mqueue none /dev/mqueue/
si připojíme fronty do adresáře /dev/mqueue
– získáme tak snadno přehled o existujících frontách v našem systému, budeme si moci prohlížet jejich velikost a nastavovat jim snadno práva.
Práva se nastavují stejně jako u souborů. Můžeme si tak vyzkoušet nastavit práva k frontě např. na 755 a pomocí jednoho uživatele (vlastníka fronty) zprávy odesílat a pomocí jiného uživatele je přijímat. Druhý uživatel nemůže ale žádné zprávy do fronty přidávat – pokud mu to chceme povolit, nastavíme práva na 777.
Frontu můžeme také jednoduše zrušit, prostě tím, že ji smažeme. V programu by to odpovídalo zavolání funkce mq_unlink()
.
V mém příkladu jsem použil systém front pro vytvoření jednoduchého jednosměrného chatu. Toto ale nebude příliš obvyklé využití – spíše použijete fronty ke komunikaci dvou procesů (programů) v rámci jednoho počítače.
Frontu si můžete otevřít současně z několika procesů a současně do ní z několika míst zprávy posílat a zároveň je na několika místech vybírat. Vyzkoušejte si např. spustit dvakrát program v přijímacím režimu a jednou v odesílacím a pozorujte, jak se zprávy distribuují střídavě mezi oba přijímače :-).
Témata: [GNU/Linux] [softwarové inženýrství] [C++]
Nemáte někdo Mac OS, abyste tenhle program a posixové fronty vyzkoušeli? :-)