Programování v Unixu

Z ωικι.matfyz.cz
Přejít na: navigace, hledání
Unix
Kód předmětu: NSWI015
Přednáší: Jan Pechanec
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]

  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[editovat | editovat zdroj]

  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ů[editovat | editovat zdroj]

  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[editovat | editovat zdroj]

  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[editovat | editovat zdroj]

  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[editovat | editovat zdroj]

  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ů?
  3. Uveďte nástroje pro synchronizaci vláken.

G) Synchronizace a zamykání[editovat | editovat zdroj]

  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ů. Popište postup zamykání pro soubory sdílené pomocí NFS.

H) IPC[editovat | editovat zdroj]

  1. Popište semafory, implementované v UNIX System V IPC.
  2. Popište sdílenou paměť, implementovanou v UNIX System V IPC.
  3. Popište fronty zpráv, implementované v UNIX System V IPC.

I) Sítě[editovat | editovat zdroj]

  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 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]

  1. Jak probíhá start operačního systému UNIX? Co jsou to úrovně běhu systému? Jak se spouští startovací skripty?
  2. Jak probíhá přihlášení uživatele do systému?
  3. Jak se používá démon cron?
  4. Jak funguje síťový server inetd?
  5. 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:

  • SIGNALvý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]

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]


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