Lab 10 - Meziprocesová komunikace

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 <pipe name>.

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

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 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);.
courses/bab36prga/labs/lab10.txt · Last modified: 2024/03/25 12:22 by faiglj