Otázky ke zkoušce Programování v UNIXu

verze: 23.9.2007

A) Vývojové nástroje
--------------------

1. Popište činnost kompilátoru jazyka C a linkeru.

2. Vysvětlete princip utility make a napište příklad jednoduchého makefile
pro překlad a slinkování programu v C.

B) Jádro a C API UNIXu
----------------------

1. Vysvětlete význam parametrů funkce main() a proměnné environ. Jak se
zpracovávají argumenty programu pomocí funkce getopt()? 

2. Vysvětlete význam pojmů proces, vlákno (thread), program. Čím se liší
proces a vlákno?

3. Vysvětlete pojmy knihovní funkce a systémové volání. Popište konvenci,
podle které systémová volání a knihovní funkce oznamují úspěšné ukončení
nebo chybu.

4. Co obsahují soubory /etc/passwd a /etc/group? Kdy a jak používá Unix
informace z těchto souborů.

5. Jak se používá identifikace vlastníka a skupiny pro testování
přístupových práv? Jaký je rozdíl mezi reálným a efektivním vlastníkem
procesu?

C) Systém souborů
-----------------

1. Jaké objekty jsou v UNIXu přístupné pomocí rozhraní systému souborů? Jaký
je rozdíl mezi znakovými a blokovými zařízeními?

2. Popište strukturu svazku typu s5 a jeho vylepšení (ufs).

3. Vysvětlete princip navigace ve struktuře adresářů, tj. jak jádro najde
podle cesty k souboru příslušné datové bloky. Vysvětlete rozdíl mezi pevnými
(hardlink) a symbolickými (symlink) odkazy na soubory.

4. Jaká jsou přístupová práva k souborům? Co je to propůjčování práv
(set UID)?

5. Jak procesy přistupují k otevřeným souborům? Jak se liší deskriptor a
otevření souboru?

6. Co je to virtual file system? K čemu slouží a jaký je princip jeho
fungování?

7. Jaký je vztah diskového oddílu a svazku? Jak probíhá vytvoření, kontrola
konzistence, připojení a odpojení svazku?

D) Procesy a roury
------------------

1. Popište paměťový prostor procesu v uživatelském režimu a v režimu jádra.

2. Nakreslete a popište stavový diagram procesu

3. Popište základy mechanismu plánování procesů. Jaké jsou prioritní třídy?

4. Popište mechanismus mapování souborů do paměti. Popište, jak lze za běhu
programu získat přístup k proměnným a funkcím definovaným v nějaké dynamické
sdílené knihovně.

E) Signály
----------

1. Co jsou to signály? Jak může být pro proces vygenerován signál? Jaký je
rozdíl mezi posláním signálu procesu a vláknu?

2. Jaké jsou možnosti ošetření signálů? Jak se nastavuje ošetření signálů
(handlery, blokování) pro proces a pro vlákna?

F) Vlákna
---------

1. Co je to vlákno, jak se liší od procesu? Které atributy jsou společné pro
proces, které jsou privátní pro každé vlákno? Jak je možné vytvořit globální
proměnnou privátní pro jedno vlákno? 

2. Popište postup při vytvoření a zrušení vlákna. Jak fungují destruktory
klíčovaných hodnot a zásobník úklidových handlerů? fork() a vlákna.

3. Uveďte nástroje pro synchronizaci vláken.

G) Synchronizace a zamykání
---------------------------

1. Vysvětlete vznik konfliktu při přístupu ke sdíleným datům a jeho řešení
pomocí zamykání. Jak může vzniknout deadlock? Popište zamykání souborů pomocí
fcntl().

2. Vysvětlete zamykání pomocí lock souborů.

H) IPC
------

1. Popište semafory, implementované v UNIX System V IPC.

I) Sítě
-------

1. Popište činnost serveru a klienta (posloupnost systémových volání) pro
spojované síťové služby.

2. Popište činnost serveru a klienta (posloupnost systémových volání) pro
nespojované síťové služby.

3. Co je to soket? Jaké jsou varianty adresace soketů (v rámci jednoho
stroje a po síti)? Jaké funkce (uveďte aspoň některé) slouží pro převod mezi
číselnými a symbolickými jmény protokolů, portů a IP adres? Proč se
používají funkce pro konverzi mezi lokálním a síťovým pořadím bajtů?

4. Popište varianty sekvenční a paralelní obsluhy klientů TCP serveru.

5. Jak funguje inetd? Jak funguje obsluha více klientů UDP serveru?

6. Jak lze čekat na příchod dat z několika deskriptorů souborů zároveň? Jak
byste tuto funkci použili při implementaci síťového serveru, který obsluhuje
několik klientů zároveň jedním procesem bez použití vláken?