{{indexmenu_n>9}}
====== Lab 09 - Meziprocesová komunikace ======
* Pro vyučující: [[courses:bab36prga:internal:tutorialinstruction:09|]]
{{ :courses:bab36prga:labs:lab09-sources.zip |Výchozí soubory lab09-sources.zip}}
===== Procvičovaná témata =====
* Práce s rourami, pojmenovanými rourami a jejich zakomponování do kódu
* Konzultace
===== Úvod =====
* Připomeňte si, jak funguje přesměrování výstupu a vstupu programů spouštěných v terminálu
* Jaký je rozdíl mezi operátory ''>'' a ''>>''?
* Vypište programem ''ls'' všechny složky ve vašem domovkém adresáři a pomocí programu ''grep'' nalezněte všechny, které začínají na písmeno D.
* Jak pomocí přesměrování vstupu a výstupu docílíte předání výstupu z programu ''ls'' na vstup programu ''grep''?
* Znáte i nějaký jiný způsob?
===== Pojmenovaná roura =====
Roura (pipe) slouží k propojení výstupu jednoho procesu na vstup druhého procesu, např. ''ls -l | wc -l''.
Roury se dělí na dvé katagorie, nepojmenované a pojmenované.
Nepojmenované roury jsou typicky UNIXové roury s ''|''.
Roury využívají zápis a čtení ze souboru s vlastním souborovým deskriptorem.
Vyzkoušejte následující příkazy v terminálu:
* ''ls -l ~ | grep Do''
* ''echo "Hello World" | tr "[A-Z]" "[a-z]"''
Pojmenovaná roura, implementovaná jako fronta FIFO, je využívaná ke komunikaci mezi nepříbuznými programy.
Pojmenovaná roura se vytvoří pomocí příkazu ''mkfifo ''.
mkfifo /tmp/my_pipe.pipe
Výstup programu ''ls -l'' zapište do roury a do souboru
ls -l > /tmp/my_pipe.pipe
ls -l > /tmp/output.txt
Obsah souboru i roury můžeme číst pomocí programu ''cat''
cat < /tmp/my_pipe.pipe
* Jak se liší obsah souboru ''output.txt'' a pojmenované roury?
* Jak se liší jejich obsah, pokud ho vypíšeme podruhé?
===== Zobrazení signálu =====
Seznamte se s přiloženým programem pro zobrazení signálu využivající knihovny [[http://otk.sourceforge.net/|OTK]] a generátorem signálu ''sgen'', které naleznete v adresáři ''signal_viewer''.
Program ''sgen'' je jednoduchý pseudonáhodný generátor EKG signálu, který vypisuje hodnoty signálu na ''stdout'' případně do souboru jeli spuštěn jako ''./sgen -f vystupni_soubor.dat''. Nápovědu k použití programu vyvoláte ''./sgen -h''.
Program ''tsignal_viewer.c'' načítá hodnoty ze ''stdin'' případně ze zadaného souboru a vykreslí signál po částech do grafického okna OTK, například jako ''./sgen | ./tsignal_viewer''
{{ :courses:bab36prga:labs:otk_plot.png?600 |}}
Knihovna OTK je přiložena v adresáři ''otk_lib''. Jedná se o relativně jednouduchou //standalone// zobrazovací knihovnu založenou na OpenGL. Její použití je zapouzdřeno v modulu ''xwin_otk_plot'' s rozhraním
void xwin_init(void);
void xwin_close();
void xwin_set_plot(int xrange, float ymin, float ymax);
void xwin_redraw_plot(int n, const float *ticks, const float *values);
void xwin_redraw(void);
Příklad použití je dále demonstrován v ''tsignal_viewer.c''.
Module ''xwin_otk_plot'' využivá periodického signálu pro aktualizaci počtu vykreslených snímků za sekund v pravém horním rohu okna. Aktualizace zobrazení je realizována funkcí ''xwin_redraw()''. V příkladu je dále demonstrována obsluha stiknutí tlačítka ''Exit'' prostřednictvím //callback// funkce ''quit()''.
Knihovnu OTK a zapouzdřující modul ''xwin_otk_plot'' využijete v úloze [[courses:bab36prga:hw:hw9|HW 9 - Vícevláknová aplikace s meziprocesovou komunikací]], nicméně pro splění úlohy není nutné využívat periodické signály nebo callback funkce. Naopak je vhodné využít více-vláknového programu a realizovat vykreslování plně synchronně.
==== Úkoly ====
* Zkompilujte knihovnu ''otk_lib'' a program ''tsignal_viewer''.
* Seznamte se s realizací zobrazovače signálu ''tsignal_viewer'' a používáním funkcí ''xwin_otk_plot''.
* Využijte pro přesměrování výstupu/vstupu pojmenováné roury.
* Program rozšiřte o alternativní funkce, např. převzorkování načteného signálu, alternativní zobrazení dlouhého signálu, periodické načítání vstupu nebo úpravu rozsahu zobrazovače ''xwin_set_plot(max_len, min - 0.5, max + 0.5);''.
/*
===== Konzultace =====
Zbytek cvičení využijte ke konzultacím ohledně HW, mohou být a volitelně rozšířené dle libovolného tématu zájmu
*/