Cvicenie 1. Procesy
- Co to je proces? Ako ho mozme identifikovat v systeme?
- Vyskusajte si prikaz ps a prikaz top. Uzitocny tip: ps -C meno_procesu
- Popiste funkciu scheduler-a.
- Aky dosledok ma znizovanie timeslice? Aky dosledok ma zvysovanie timeslice?
- Nakreslite stavovy diagram procesu. Popiste jednotlive stavy. Popiste prechody medzi nimi.
- Spustime naraz nasledovne tri skripty:
A.sh: echo 1A; sleep 1; echo 2A; sleep 1; echo 3A
B.sh: echo 1B; sleep 1; echo 2B; sleep 1; echo 3B
C.sh: echo 1C; sleep 1; echo 2C; sleep 1; echo 3C
Kazdy proces dobehne uspesne do konca a vsetky vypisuju na jednu konzolu. Vypis retazca je atomicky. Nepozname zataz systemu. Kolko roznych vysledkov mozme dostat? - Popiste systemove volanie kill(). Pozrite a vyskusajte si aj prikaz kill. Vypiste zoznam signalov cez kill -l. Pozrite si manualovu stranku prikazu kill (man 1 kill) a systemoveho volania kill (man 2 kill).
- Popiste systemove volanie exit(). [man 2 exit]
- Popiste systemove volanie fork(). [man 2 fork]
- Popiste systemove volanie waitpid(). [man 2 waitpid]
- Stiahnite a skompilujte si program whilefork.c. Ako sa zachova vas system po jeho spusteni? (Uzitocny tip: prikaz ulimit a linuxovy "opici trojhmat -- Magic System Request" Alt-PrtScr-B (alebo lepsie: -U-S-B; pomoc: H (len na konzole), ...) Zmente cyklus tak, aby sa opakoval len 5 krat. Kolko procesov vznikne za predpokladu, ze kazde volanie fork() bude uspesne?
- Stiahnite a skompilujte si program mykill.c. Vyskusajte pomocou neho poslat signaly procesom. Co sa stane, ak poslete signal 15 bash-u? Co sa stane, ak poslete signal 9 init-u?
-
DU1a: (3 body) safekill
Zauzivana funkcia signalu SIGINT (2) je uzivatelova ziadost na ukoncenie procesu. Niektore programy signal 2 ignoruju, niektore korektne skoncia. Da sa pouzit aj tvrdsi signal SIGTERM (15), co je ziadost na ukoncenie. Aj tento signal moze proces ignorovat. Napokon je tu SIGKILL (9), ktory sa ignorovat neda a proces je ukonceny systemom.
Napiste program safekill.c, ktory postupne s casovymi prestavkami najprv posle procesu signal 2, potom signal 15, a potom signal 9. Syntax nech je:
safekill seconds proces
Vyuzite navratovu hodnotu systemoveho volania kill a chybovu hodnotu errno na zistenie, ci proces existuje, a ci sa ukoncil korektne alebo ho bolo treba ukoncit nasilne. Podla toho zvolte navratovu hodnotu vasho programu: -1 ak neexistuje, 0 ak sa ukoncil korektne na SIGINT alebo SIGTERM, 1 ak musel byt ukoncovany nasilim, 2 ak nastala ina chyba (napr. nedostatocne prava alebo zly pocet argumentov).
Hint: Na testovanie mozte pouzit nasledovne programy, ktore si mozete spustit napr. na druhej konzole a sledovat, co s nimi Vas program spravi:
top -- skonci na 2
mc -- ignoruje 2, skonci na 15
bash -- ignoruje 2 aj 15, skonci na 9
Hint: na spanie mozte pouzit standardnu funkciu sleep (man 3 sleep). -
DU1b: (2 body) process_chain
Napiste program, ktory vytvori dieta a pocka, kym dieta skonci. Dieta urobi to iste, ale toto sa bude opakovat len 9 krat. Posledne 10. dieta skonci bez vytvorenia dalsieho dietata.
Spravi sa tak vlastne retaz procesov od rodica az po posledne dieta, a ukoncovat sa budu v opacnom poradi, ako vznikali. [Hint: na cakanie pouzite funkciu waitpid, pozor na spravny pocet a typy argumentov]
Ulohy posielajte mailom so subjectom OSDU1, poslite ich ako prilohu, na adresu
. Ulohy musia byt skompilovatelne. Termin: 13.3.2011 do 13:00.