{{indexmenu_n>10}} ====== Lab 10 - Meziprocesová komunikace ====== * Pro vyučující: [[courses:bab36prga:internal:tutorialinstruction:10|]] {{ :courses:bab36prga:labs:prga-lab10-sources.zip |Výchozí soubory prga-lab10-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''. OTK je jednoduchá knihova grafických prvků implementovaná v OpenGL. Kompilace může vyžadovat instalaci potřebných knihoven. Např. v operačním systému založeném na Ubuntu to může být ''libxmu-dev'' tedy ''apt install libxmu-dev''. 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:hw9b|HW 9B - 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 */