24. 05. 2018 pst

Seznámení se základními principy operačního systému UNIX, převážně z uživatelského hlediska. Absolvent kurzu by měl být schopen napsat netriviální program v shellu.
Thrayld
Matfyz(ák|ačka) level I
Příspěvky: 10
Registrován: 25. 1. 2018 22:01
Typ studia: Informatika Bc.

24. 05. 2018 pst

Příspěvek od Thrayld »

Zadání víceméně odpovídalo http://forum.matfyz.info/viewtopic.php?f=244&t=8324.

Měli jsme vypsat procesy, které odpovídají parametrům, v hierarchické struktuře otec - syn až k prvnímu procesu - init. Ideálně v nějakém hezkém formátu, který zachytí správně stromovou strukturu (nějaké odsazení, či znaky na začátku každé řádky podle hloubky "zanoření"). Omezení bylo, že smíme nejvýše jednou volat příkaz ps.
Parametry byly dvou typů - "podmínky" a "sloupce".

Podmínky říkaly, co má vypsaný proces (jako list stromu) splňovat (vše zároveň). Byly ve tvaru "field=hodnota" - například "ppid=156", nebo "field~pattern". Mohli jsme si vybrat, zda to budou porovnávací vzory a nebo regexpy (asi záleželo, jestli to člověk dělal v shellu, nebo v awk). Například tedy "field~^ls".
Nejednou si zanadával na to, že to zadání nedává moc smysl a mezi podmínkami by měla být spíše disjunkce.

Parametry, které označovaly sloupce, říkaly, jaké sloupce se mají na výstupu objevit. Například tedy ppid,pid,command,tty. Prostě to, co umí ps -o. Pokud uživatel nic nezadal, tak implicitní formát je v proměnné DEFAULT_FIELDS.

Všech typů parametrů mohlo být libovolně mnoho a v libovolném pořadí.

Forst říkal, že nejlepší bylo se moc nezaobírat, s čím se bude to ps volat. Bylo nutné vždy vypsat pid a ppid a k tomu nejlépe naskládat všechny ty ostatní parametry ve stejném počtu, v jakém je uživatel zadal. Pak se nemusela moc řešit podmínka (na označení těch procesů, co odpovídaly vzoru), protože se dala předpřipravit v shellu (v awk vždy bylo jasné, v jakém sloupci danou hodnotu hledat) do proměnné a pak ji vložit do awk scriptu.
Dál si přesně nejsem jistý, jak přesně to Forst říkal. Já jsem potom v awk přes různá pole označil všechny procesy, které se budou vypisovat (našel jsem listy a od nich šel nahoru a označoval) a pak jsem je rekurzivní funkcí vypsal (pro každé pid jsem vytvořil seznam synů a funkce vypsala proces z parametru a postupně se zavolala na označené syny).

Myslím, že klíčové bylo vymyslet jak správně zachytit podmínku - bylo potřeba si ji vyrábět hned při čtení parametrů. Pak ji vyhodnotit buď přímo v shellu (pokud to někdo dělal v shellu, Forst říkal, že to taky šlo) pomocí eval, nebo si ji hodit do awku. Tím se daly označit hledané procesy.
Druhá klíčová věc byla IMHO sestavit si strom, který se bude vypisovat (nebo si ve stromě označit všechny vypisované prvky) a pak je rekurzivně vypsat, jinak by se ta struktura dělala dost těžko.

Forst některé věci odpouštěl (nevím, jestli se vůbec někdo dostal k tomu "hezkému formátování') a říkal, že to ani není potřeba mít nějak perfektně (tj. nečeká hned spustitelný soubor), hlavně aby tam byly důležité body a sem tam není problém něco dopsat stylem "tohle potřebuje trochu dodělat..".

Skóre bylo po písemné části 3 jedničky, 1 dvojka, 2 čtyřky a 3 ústní.
Odpovědět

Zpět na „SWI095 Úvod do UNIXu“