Operacni System TUOX


Zadani:

Testovani knihovnich funkci a vyjoj testovacich programu (synchronizace procesu signal,wait,..) pro ukazku.

Jindrich Abeska L94734, Jana Holusova L95368

mail: jindrich.abeska.fei@vsb.cz
jana.holusova.fei@vsb.cz

Odkaz na zdrojove kody:

Sources

Dokumentace:

Dokumentace

Odkazy na predchozi rocnik 97/98:

Odkaz na MM 97/98

Last update 26.6.1999

Zatim jsme provedli :

Ted se v adresari "sources" nachazi soubory:
- !!! mm.h z adresare mm, bylo zde pridan dalsi parametr zpravy, MM_SETFLAG je typu m6_i2, ktery slouzi pri nastavovani pro obsluhu signalu. Pokud je MM_SETFLAG nastaven na 1, tak jestlize se parametr func ve funkci signal() rovna SIG_DFL, tak chci defaultni obsluhu nebo func se rovna SIG_IGN, tak chci signal ignorovat. Pokud je MM_SETFLAG = 0, tak nastavuji obsluhu na svoji rutinu.
- !!! signal.c z adresare mm, bylo zde prepracovana funkce do_signal().
- !!! getset.c z adresare mm, bylo zde odhalena chyba ve funkce FindIndex(), nebylo zde inkrementovani pomocne promenne "poc" pro prochazeni tabulky, takze program zatuhl.
- !!! signal.h z adresare COMMON, bylo zde u dvou signalu stejna cisla, opraveny soubor je zde!!!
- test65t.c je prepsany testovaci program "test65.c" vyuzivajici knihovni funkce ze souboru "process.c" v adresari "old"
- test67t.c je prepsany testovaci program "test67.c" vyuzivajici knihovni funkce ze souboru "process.c" v adresari "old"
- test68t.c je prepsany testovaci program "test68.c" vyuzivajici knihovni funkce ze souboru "process.c" v adresari "old"
- test68n.c je prepsany testovaci program "test68.c" vyuzivajici knihovni funkce ze souboru "process.c" v adresari "new"
- test69t.c je prepsany testovaci program "test69.c" vyuzivajici knihovni funkce ze souboru "process.c" v adresari "old"
- test69n.c je prepsany testovaci program "test69.c" vyuzivajici knihovni funkce ze souboru "process.c" v adresari "new"
- test70t.c je prepsany testovaci program "test70.c" vyuzivajici knihovni funkce ze souboru "process.c" v adresari "old"
- test70n.c je prepsany testovaci program "test70.c" vyuzivajici knihovni funkce ze souboru "process.c" v adresari "new"
- test71t.c je prepsany testovaci program "test71.c" vyuzivajici knihovni funkce ze souboru "process.c" v adresari "old"
- test71n.c je prepsany testovaci program "test71.c" vyuzivajici knihovni funkce ze souboru "process.c" v adresari "new"
- test72t.c je prepsany testovaci program "test72.c" vyuzivajici knihovni funkce ze souboru "process.c" v adresari "old"
- test73t.c je prepsany testovaci program "test73.c" vyuzivajici knihovni funkce ze souboru "process.c" v adresari "old"
- test76.c - testovaci program na signaly, rozforkujeme ctyry procesy. Kazdemu procesu nastavime cislo grupy bud 10 nebo 20 podle promenne 'i' { cykles for} je delitelne modulo 2. Pouziva soubor "process.c" z adresare "new"
- test77.c - testovaci program na signaly, rozforkujeme sest procesu. Prvnim trem nastavine cislo grupy 10, druhym trem nastavime cislo grupy 20 a pote posleme skupine s cislem 10 signal SIGTERM. Pro kazdy proces nastavime obsluznou rutinu. Pouziva "process.c" z adresare "new".
- test78.c - testovaci program na signaly, rozforkujeme dva procesy. Prvnimu posleme signal SIGTERM. Pro oba dva nastavime obsluznou rutinu. Pouziva "process.c" z adresare "new"
- kmain.c zde je odstranena funkce "exit()", protoze v knihovnich funkcich je tate funkce "exit()" a pri linkovani by to zahlasilo chybu typu "duplic.."
- v adresari "old" soubory process.h, process.c, process.obj, kde jsou zatim promitnuty body 1, 2, 5 a 6.
- v adresari "old" soubor process.zip ve kterem je zazipovan soubor "process.obj"
- v adresari "new" soubory process.h, process.c, process.obj, kde jsou zatim promitnuty body 1, 2, 5, 6, 8, 10, 11, 14 a 15.
- v adresari "new" soubor process.zip ve kterem je zazipovan soubor "process.obj"
- v adresari "linux" soubory "test74l.c" a "test75l.c"

Jelikoz nebyla funkce pid_t getppid(), tak jsme ji dodelali viz. body 1 a 2.

1. v lib\include.process.h: jsme pridali definici funkce pid_t getppid(void)
2. v lib\process\process.c jsme pridali deklaraci funkce pid_t getppid(void), obdobne jako je delana funkce getpid(), pouzili jsme C_GETPID. Protoze je v mm\mm.h definovana konstanta MM_GPPID, tak jsme ji pouzili v souboru process.c ve funkci getppid().
3. v programu kmain.c se musi funkce exit() alespon dat jako komentar, protoze jinak by nastala chyba pri linkovani. A v projektu musi byt pridan process.c nebo process.obj. Oba soubory jsou pristupne.
4. uz jsme stacili zatim prepsat testovaci program "test65.c" a "test67.c". Jsou zde jako "test65t.c" a "test67t.c". Dalsi programy zahy prepiseme. Duvod je ten, ze tyto programy pouzivaji funkci "signalHandlerInLib()" na kterych se ted pracuje.
5. s velkou pomoci pana ing. Grygarka jsme odhalili chybu v souboru "process.c" ve funkci "signal()". Pri volani teto funkce se nespecifikovalo typ zpravy. Nebyl zde radek "m.m_type = C_SIGNAL;".
6. v souboru "process.c" jsme prepsali funkce wait() a waitpid() tak, aby byla shodna s volanim v unixu. U funkce wait() jsme museli misto "m.MM_WAITOPT = WNOHANG;" napsat "m.MM_WAITOPT = 0;". Po tomto program "test67t.c" pracoval stejne jako testovaci program "test67.c", ale v programu "test67t.c" jsme pouzili waitpid().
7. v souboru "signal.h" objevena chyba , pro dva signaly bylo pouzito jedno cislo. Po konzultaci s panem ing. Grygarkem opraveno. Opravena verze je zde ke stazeni.
8. do souboru "process.c" byla pridana tabulka "signal_tab", ktera bude obsahovat ukazatele na obsluzne rutiny. Ty se budou vkladat pomoci volani funkce signal(). Do souboru "process.h" byla pridana deklarace funkce signalHandlerInLib a v souboru "process.c" je pridana definice teto funkce.
9. prepsany dalsi testovaci programy, u testovacich programu test68t.c az test71t.c je pouzito zatim pouze soubor "process.c" z adresare "old".
10. do souboru "process.c" byla pridana funkce registSignalHandler(), ktera registuje pro dany signal funkci signalHanlderInLib().
11. do souboru "process.c" a jeho hlavickoveho souboru "process.h" byly zaneseny vsechny zmeny, ktery udelala skupina, ktera testovala v MM knihovni funkce.
12. byl udelan testovaci program na testovani signalu "test77.c". Pouziva soubor "process.c" z adresare "new".
13. byl udelan testovaci program na testovani signalu "test78.c". Pouziva soubor "process.c" z adresare "new".
14. s dalsi velkou pomoci pana ing. Grygarka se odhalila chyba ve funkci FindIndex() v souboru "mm\getset.c", pro pruchod polem se neinkrementovala promenna, ktera indexovala pole. Dale jsme upravili funkci do_signal() v souboru "mm\signal.c" a v souboru "lib\process.c" upravili funkce signaHandlerInLib() a signal().
15. dodelany jeste nejake korence v souboru "process.c", aby pri kompilovani bylo ce nejmene varovani typu
16. byly jeste dopracovany testovaci programy "test68n.c", "test69n.c", "test70n.c" a "test71n.c" tyto programy vyuzivani "process.c" z adresare "new"
17. s pomoci pana ing. Grygarka se odhalila chyba ve funkci signal() v souboru "process.c"
- 20.6.1999
18. v funkci do_signal() ze souboru "signal.c" bylo podle puvodniho souboru nastavena promenna "Maska" na jednicku, po teto uprave normalne funguji testovaci programy "test68n.c" a "test69n.c" u "test70n.c" a "test71n.c" nastava chyba.
19. byl udelan testovaci program ta testovani signalu "test76.c". Pouziva soubor "process.c" z adresare "new".
- 21.6.1999
20. byli provedeny upravi testovacich programu "testxxn.c" kde xx je 68, 69, 70 a 71. Zkouseli jsme testovat programy "testxxt.c" kde xx je 65, 67, 72 a 73 s soubory z adresare "new" a vse probehlo v poradku.
- 26.6.1999
21. Byly udelany testovaci programy "test74l.c" a "test75l.c", ktere jsou napsany pod linuxem. Testovaci program "test74l.c" rozforkuje nekolik procesu, pro kazdeho registruje obsluznou rutinu, poslednim par procesu nastavi setpgit(getpid(),0), takze se pgid zmeni na pid. Pro posledni proces, ktery si zmeni pgid se posle signal. Signal chyti vsechny procesy, ktere si zmenily pgid. Testovaci program "test75l.c" rozforkuje ctyri procesy. Procesy se ukonci bud exitem nebo signalem a parent process na ne ceka bud funkci wait nebo waitpid.
22. Ukonceni prace, vsechny soubory, ktere jsme vytvorili nebo zpozmenili jsou dostupne v "Source".

Problemy:
a. Pri testovani jsme zjistil, ze pokud testujeme puvodne napsany testovaci program "test68.c" a nastavim "m.MM_PTRFUNC=SIG_IGN" a mame i stary soubor "signal.c" z kernel.zip, tak nastane chyba typu -3 " neexistuje proces". Zatim jsme neprisli na to proc se to tak chova. Tak se to chova i pri testovani prepsaneho programu "test68n.c", ktery pouziva soubory z adresare "new".
b. Pokud v programu si nastavim na signal obsluznou rutinu a delal fork() {vice procesu}, tak se mi nevyvola obsluzna rutina. Ale pokud je jeden proces { nevolam v programu fork()} tak se obsluzna rutina vyvola. Zatim jsme neprisli na to proc to tak je.
c. Testovaci programy "test70n.c" a "test71n.c", ktere pouzivaji praci s alarmem take nevyvolaly obsluzne rutiny pro obsluhu.