Programování v Unixu
Z ωικι.matfyz.cz
(Přesměrováno z Unix)
Unix | ||||
|
- Oficiální materiály a informace ke zkoušce: http://www.devnull.cz/mff/programovani-v-unixu/2010
Poznámky ke zkouškovým otázkam z teorie[editovat | editovat zdroj]
- Ve slajdech je toho většina pěkně, tak zatím jen ty otázky (hlavně si sežeňte slajdy, kde jsou kromě obrázků i nějaké poznámky k nim, konkrétně tyto (Beran) nebo tyto (Pechanec)
- Letošní slajdy se mírně změnily, vzhledem k tomu, že Pechanec přestal vykládat NCURSES a dal tam podle mě víc threadů.
A) Vývojové nástroje[editovat | editovat zdroj]
- Popište činnost kompilátoru jazyka C a linkeru.
- 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[editovat | editovat zdroj]
- Vysvětlete význam parametrů funkce main() a proměnné environ. Jak se zpracovávají argumenty programu pomocí funkce getopt()?
- Vysvětlete význam pojmů proces, vlákno (thread), program. Čím se liší proces a vlákno?
- 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.
- Co obsahují soubory /etc/passwd a /etc/group? Kdy a jak používá Unix informace z těchto souborů.
- 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ů[editovat | editovat zdroj]
- 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?
- Popište strukturu svazku typu s5 a jeho vylepšení (ufs).
- 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.
- Jaká jsou přístupová práva k souborům? Co je to propůjčování práv (set UID)?
- Jak procesy přistupují k otevřeným souborům? Jak se liší deskriptor a otevření souboru?
- Co je to virtual file system? K čemu slouží a jaký je princip jeho fungování?
- 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[editovat | editovat zdroj]
- Popište paměťový prostor procesu v uživatelském režimu a v režimu jádra.
- Nakreslete a popište stavový diagram procesu
- Popište základy mechanismu plánování procesů. Jaké jsou prioritní třídy?
- 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[editovat | editovat zdroj]
- 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?
- 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[editovat | editovat zdroj]
- 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?
- 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ů?
- Uveďte nástroje pro synchronizaci vláken.
G) Synchronizace a zamykání[editovat | editovat zdroj]
- 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().
- Vysvětlete zamykání pomocí lock souborů. Popište postup zamykání pro soubory sdílené pomocí NFS.
H) IPC[editovat | editovat zdroj]
- Popište semafory, implementované v UNIX System V IPC.
- Popište sdílenou paměť, implementovanou v UNIX System V IPC.
- Popište fronty zpráv, implementované v UNIX System V IPC.
I) Sítě[editovat | editovat zdroj]
- Popište činnost serveru a klienta (posloupnost systémových volání) pro spojované síťové služby.
- Popište činnost serveru a klienta (posloupnost systémových volání) pro nespojované síťové služby.
- 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ů?
- Popište varianty sekvenční a paralelní obsluhy klientů TCP serveru.
- 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?
J) Administrace[editovat | editovat zdroj]
- Jak probíhá start operačního systému UNIX? Co jsou to úrovně běhu systému? Jak se spouští startovací skripty?
- Jak probíhá přihlášení uživatele do systému?
- Jak se používá démon cron?
- Jak funguje síťový server inetd?
- Jaké úkoly má správce Unixu?
Přehled funkcí[editovat | editovat zdroj]
Signály[editovat | editovat zdroj]
int kill(pid_t pid, int sig)
Některé signály:
- SIGNAL → výchozí akce - popis
- SIGKILL → exit - zrušení procesu; nelze ošetřit ani ingorovat
- SIGUSR1 → exit - uživatelsky definovaný signál 1
- SIGUSR2 → exit - uživatelsky definovaný signál 2
- SIGSTOP → stop - pozastavení procesu; nelze ošetřit ani ingorovat
- SIGALRM → - poslán procesu po vypršení lhůty po zavolání unsigned int alarm(unsigned int seconds);
- SIGWINCH → - poslán procesu když terminál změní svoje parametry
int sigaction(int sig, const struct sigaction* act, struct sigaction* oact); int sigprocmask(int how, const sigset_t* set, sigset_t* oset); int sigwait(const sigset_t* set, int* sig); // čeká na signál z množiny set (musí být zablokované) // číslo signálu vratí v sig // nevolá handler, ale to prý není normou jednoznačne definováno
Manipulace se sigset_t:
int sigemptyset(sigset_t* set); int sigfillset(sigset_t* set); int sigaddset(sigset_t* set, int signum); int sigdelset(sigset_t* set, int signum); int sigismember(const sigset_t* set, int signum);
System V IPC obecně[editovat | editovat zdroj]
key_t ftok(const char* path, int id);
Sdílená paměť[editovat | editovat zdroj]
int shmget(key_t key, size_t size, int shmflg); // shared memory get void shmat(int shmid, const void* shmaddr, int shmflg); // shared memory attach int shmdt(const void* shmaddr); // shared memory detach int shmctl(int shmid, int cmd, struct shmid_ds* buf); // shared memory control
Náznak možného použití
struct shmem { int size; char buf[BUFSIZE]; }; fce() { key_t shmkey; int shm_id; struct shmem* pshmem; shmkey = ftok(argv[1], 123); shm_id = shmget(shmkey, sizeof(struct shmem), IPC_CREAT|0600); pshmem = (struct shmem*) shmat(shm_id, NULL, 0); pshmem->size = BUFSIZE; ...
Vlákna (pthreads; POSIX threads)[editovat | editovat zdroj]
pthread_create (tid, attr, start_routine, arg); pthread_exit (value); pthread_join (tid, value_ptr); ...
Vzajemné vyloučení (mutex)[editovat | editovat zdroj]
pthread_mutex_init (mutex, attr); pthread_mutex_destroy (mutex); pthread_mutex_lock (mutex); pthread_mutex_trylock (mutex); pthread_mutex_unlock (mutex);
Podmínkové proměnné (Condition Variables)[editovat | editovat zdroj]
pthread_cond_init (condition, attr); pthread_cond_destroy (condition); pthread_cond_wait (condition, mutex); pthread_cond_signal (condition); pthread_cond_broadcast (condition);
Poznámka k použití
- Používá se ve spolupráci s (pthread) mutexem.
- Účel mechanizmu - Vlákno nemusí aktivně cekat, až proměnná splní určitou podmínku.
Příklady[editovat | editovat zdroj]
Odkazy[editovat | editovat zdroj]
Obecné[editovat | editovat zdroj]
- www.cs.tau.ac.il izraelské lekce operačních systémů ;-)
- Na adrese www.za-peci.ic.cz/unix/ je přepis poměrně obsáhlé učebnice v češtině
- Linux Programmer guide
Síť - Sokety, ...[editovat | editovat zdroj]
Vývojové nástroje[editovat | editovat zdroj]
- asi nezbytná věc potřebná ke složení zkoušky je ovládnout vim, pokud si s ním příliš nerozumíte možná vám pomůže seznam základních VIM triků
Ladění pod UNIXEM[editovat | editovat zdroj]
- pokud se něco nechová tak jak má, je v celku dobré ovládnout Ladění pod UNIXEM - gdb, mtrace
Literatura[editovat | editovat zdroj]
- Pokročilé programování v operačním systému Linux (SoftPress) - pozor na to, že některé věci v knize jsou specifické pro Linux a nemusí platit obecně v Unixu