Forst 21.5.2015 predtermin

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.
darthdeus
Matfyz(ák|ačka) level I
Příspěvky: 6
Registrován: 24. 2. 2014 16:49
Typ studia: Informatika Ph.D.
Bydliště: Praha
Kontaktovat uživatele:

Forst 21.5.2015 predtermin

Příspěvek od darthdeus »

Zadani bylo program explog (udajne s nizkou historickou uspesnosti)

Vstup: program dostane dva parametry
- XXX[X] - cislo zpravy, vysvetleno dale
- [ files ... | dir ] - seznam nekolika souboru, nebo adresare, nebo se zpracovava aktualni adresar, pokud neni zadano nic

Soubory jsou normalni Cckove zdrojaky, ktere obsahuji volani funkce `log`, konkretne ve formatu

log ( "XXXX-NNN-S Text zpravy", ... dalsi parametry )

XXXX je nejake ID zpravy, XXXX-NNN dohromady tvori `prefix`, a `S` je severity (jeden znak, pro veci jako debug/warning/error/etc.) Okolo `log` a zavorek muzou byt mezery, ty se maji ignorovat, pripadne dalsi parametry logu taky ignorovat.

Ke kazde chybe existuje soubor `/doc/messages/XXXX-NNN`, ktery ma nasledujici format:

Id: XXXX-NNN-S XXXX-NNN-S ...
Text: Text zpravy
Description: Nejaky description ...

Za dvojteckou je tabulator (ikdyz to pri spravnem zpracovani nehraje roli.), pod `Id:` je seznam vsech pouziti `XXXX-NNN-S`, tzn pokud jsou zpravy ktere maji stejny prefix ale ruzne severity, budou tam vypsany, napr. si to predstavte jako

Id: 1234-555-W 1234-555-E 1234-555-D

Text zpravy je jednoduse text zpravy.

---

Cilem je zpracovat vstupni zdrojove soubory, a vytvorit log ktery ma nasledujici format.

XXXX.log (tj soubor ktery ma nazev pouze ID, a obsahuje veci relevantni pro zadane XXXX)

stav zdrojak XXXX-NNN-S Text zpravy ...

Kde `stav` muze byt jeden z nasledujicich:

- OK - nenastala zadna chyba
- MISS - pouziva se `log( ... )` ale nema odpovidajici soubor v `/doc/messasges`
- DUPL - existuje vic zprav se stejnym XXXX-NNN, ale maji jiny text (at uz v ramci zdrojaku, nebo v `/doc/messages/...`
- ERR - najdeme severity, ktera neni ve zdrojaku, tzn. v nejakem `/doc/messages/XXXX-NNN` existuje pod polickem `Id:` takove `XXXX-NNN-S`, ze se v zadnem zdrojaku nepouziva.
- UNEX - nenaslo se volani `log( ... )` pro nejake `XXXX-NNN-S`, ale existuje pro nej `/doc/messages/...` soubor.

Druhy sloupecek `zdrojak` je jednoduse soubor, ve kterem se chybny `log( ... )` vola, `XXXX-NNN-S Text zpravy ...` je pouzity text v miste chyby.

---

Jak je asi zrejme z chybovych hlasek, je nutne kontrolovat minimalne nasledujici:

- Vsechny volani `log ( ... )` maji odpovidajici `/doc/messages/...`, ktery obsahuje presne to same `XXXX-NNN-S` pod `Id: ` a ma identicky `Text:`.
- Vsechny `XXXX-NNN-S` ve vsech `/doc/messages/...` jsou vyuzite, tzn. neexistuje soubor k logove zprave, ktera by byla nepouzita.
- Vsechny severity jsou pouzite, a naopak se nepouziva zadna, ktera by nebyla nevyuzita.
- Vsechny texty napric vsemi volanimi `log ( ... )` jsou stejne, pokud je stejne `XXXX-NNN-S`.

---

Dalsi veci ktere bylo potreba resit, ale nebyly kriticke:

- Volani `log(" ... ")` muze byt rozdeleno na dva radky (pouze dva), a to ceckovym zpusobem rozdelnovani stringu, tzn. presne v tomto tvaru

log("XXXX-NNN-S Nejaky text ktery"
"je moc dlouhy na to aby se vesl na radku")

- Text logovaci zpravy muze obsahovat escape sequence, hlavne \" (coz hodne meni jak je parsujete)
- Kazdy zdrojovy vstupni soubor se musi napred projet preprocessorem, coz znamena na nej zavolat pred jakymkoliv zpracovanim `cc -E soubor.c`.

---

Jeste par poznamek ke vstupu. Pokud prvni parametr je jenom XXX, musi se najit vsechny zpravy, ktere zacinaji zadanymi znaky, tzn. napr. nekdo zavola `./explog.sh 123`, tak musim najit jak `log("1234-555-D ...")` tak `log("1236-555-D ...")`. Pokud jsou zadane 4 znaky, tzn XXXX, tak hledat a zpracovat pouze ty zpravy, ktere maji presne takoveto ID.

---

Na reseni ulohy jsme meli 2 hodiny, k dispozici byl jeden FreeBSD notebook, ktery vzheldem k tomu ze nas psalo pouze 5 byl volny vetsinu casu. Obcas tam nekdo prisel, neco tam natukal a zase odesel, ja sam ho vyuzil asi 6x, ale ve vysledku mi to pomohlo jenom v jedne veci, abych si otestoval konkretni pripad pouziti AWK.

Co se tyce narocnosti ulohy, myslim ze pokud clovek zvolil spravne reseni, tak to mohl mit hodne rychle. Pokud to budete zkouset resit, napred se zamyslete nad vsim co musite na vystupu mit, a podle toho si zvolit vhodne datove struktury. Prislo mi to jako spis lehci ale hodne pracna uloha, nez neco, co by bylo extra tezke vymyslet. Ve vysledku jsem popsal asi 6 A4, ale nepouzil jsem zadnou velkou shellovou magii.

Z tech 5 lidi jsme dva dostali jednicku hned, a zbytek nevim jak dopadl.
Odpovědět

Zpět na „SWI095 Úvod do UNIXu“