Programování v Unixu - cvičení

MFF UK, zimní semestr 2015/2016
čtvrtek 10:00 - 10:30 v SU2 (Malá Strana)

Zápočty

Zadání

Nutnou a postačující podmínkou pro udělení zápočtu je vytvoření a odevzdání zápočtového programu. Vy mi pošlete specifikaci programu který hodláte napsat a po případné další komunikaci a po té, co bude mnou schválena (nebo taky ne) je toto zadání vašeho zápočtu. Zápočtový program musí být napsán v jazyce C a musí obsahovat netriviální použití služeb UNIXu z alespoň dvou následujících oblastí:

Podmínka použití služeb UNIXu je splněna, pouze když je příslušná služba použita přímo, ne prostřednictvím další nadstavbové knihovny. Můžete tedy sice používat fopen(), fread() nebo printf() a fprintf() (knihovna stdio), ale jako použití souborových operací se vám počítají pouze funkce typu open(), read(), write() atd. (Ale nepřehánějte to - nemá smysl reimplementovat knihovní funkce jako strdup() nebo snprintf().)

Podmínky pro vypracování

Prosím vemte na vědomí, že tyto podmínky jsou závazné. Jednou z věcí, která studentům dělá velké problémy, je pořádně si přečíst zadání. Opravdu vám doporučuji, abyste to zde udělali, a to před začátkem práce na vašem programu.

  1. ošetřujte chyby a rozumně reagujte na nesprávný vstup. Pokud program vyžaduje parametry, vypište help když program parametry nedostane.
  2. zdroják zápočtového programu musí být vhodně rozdělen do více souborů a kompilace řízena pomocí programu make a netriviálního Makefile (oddělený překlad a linkování, správné závislosti, použití maker - musí fungovat alespoň $(CC), $(CFLAGS) a $(LDFLAGS), překladač gcc musí používat -Wall, překladač cc (tj. například Solaris) pak -v).
  3. překlad vašeho kódu musí proběhnout bez varování.
  4. součástí zápočtového programu je i uživatelská a technická dokumentace (viz. Předání)
  5. pokud se se mnou nedohodnete jinak, musí být zápočtový program přeložitelný a fungovat v UNIXové laboratoři, a to alespoň na dvou různých systémech - tedy například na Linuxu a na Solarisu (u-us), FreeBSD (pokud máte konto třeba na mail.kolej) atd. Linuxová emulace pod jiným systémem se nepočítá (např. kernel option LINUX_COMPAT pro FreeBSD apod).
  6. pokud použijete již existujicí kód je to OK, ale musíte to mít ve specifikaci a v technické dokumentaci pak napsat co přesně jste převzali. Dodržujte copyright převzatého kódu.
  7. váš kód musí mít jednotnou úpravu pomocí cstyle (tedy není samozřejmě nutné a ani rozumné přepisovat kód, který jste použili cizí -- předpokládám, že v takové situaci bude cizí kód v samostatném souboru. Pokud byste rozšiřovali existující aplikaci, dodržujte úpravu existujícího souboru.)
  8. síťový kód pište výhradně pomocí funkcí podporujících IPv4 i IPv6. Použití gethostbyname, gethostbyaddr nebo struktur specifických pro IPv4 není přijatelné.
  9. program nesmí používat funkce, které jsou deprecated, obsolete nebo unsafe (viz. manuálové stránky). Příklady: gets, strcat, access, chmod, sprintf, getlogin, atoi, mktemp, popen
  10. program nesmí používat aktivní čekání

Předání

Předání probíhá formou odkazu na veřejné repository na githubu (nebo na jiném veřejně dostupném serveru pro sdílení zdrojových kódů s podporou distribuovaného verzovacího systému). Repository musí obsahovat vše potřebné ke kompilaci (zdrojáky, Makefile), stručnou dokumentaci v souboru README.md (abstrakt, kompilace, použití, architektura, testy, negativní vymezení, ...) a testy s rozumným pokrytím funkcionality včetně ošetření špatného zadání apod.

Většinou by mělo být možné vyřešit předání e-mailem, ale některé věci můžeme chtít předvést na živo.

Počítejte prosím s tím, že na prohlédnutí vašeho zápočtového příkladu potřebujeme alespoň 2-3 dny.

Náměty na zápočtové programy

Neakceptuju zadání typu klasický talk, lodě, piškvorky a jim podobné blbosti. Rozhodující je pak specifikace programu, na které se se mnou dohodnete. Není potřeba v zápočtáku řešit velké věci, důležité je, aby to co odevzdáte bylo podle vámi zadané specifikace, ucelené a dobře odladěné.

  1. preferuji vlastní zadání, případně variaci na následující zadání, ideálně aby to bylo použitelné v praxi. Může to být i rozšíření existující aplikace o vhodné funkce.
  2. jednoduchý shell
    spouštění příkazů s parametry, přesměrování, roury, nastavení prostředí procesů, nastavení a použití proměnných (stačí VAR=value a $VAR), expanzní znaky, interní příkaz cd, skripty (posloupnost příkazů v souboru, bez řídicích konstrukcí), případně job control atd. Je možné vzít i jen nějakou podmnožinu, např. pokud chcete dělat job control, není potřeba dělat vše ostatní apod.
  3. tar
    základní funkce: uložení souborů do archivu, výpis obsahu a rozbalení archivu, spolupráce s externím komprimačním programem (např. gzip), další rozumné vlastnosti (viz man). Spolupráce s existujícími implementacemi (GNU tar, BSD tar, Solaris tar) je samozřejmostí.
  4. ftp server
    rozumná podmnožina protokolu FTP - tj. vemte si RFC 959, vyhodte veci, co jsou zastarale ci se nepouzivaji a zbytek implementujte (napr. uvazujte pouze pasivni mod, pouze binarni prenos souboru atd. - podivejte se pro predstavu na nejakou zakladni implementaci ftp jak je dodavana v nekterem z operacnich systemu)
  5. tftp server
    TFTP server podle RFC specifikace.
  6. www server
    rozumná podmnožina protokolu HTTP/1.1, poskytování statických stránek, včetně jednoduché implementace CGI skriptů (dynamické stránky), uvažte možnost podpory virtual hosts, konfigurovatelný způsob paralelní obsluhy (pre-fork, fork, vlákna) apod.
  7. make
    závislosti, spouštění příkazů, definice a použití maker (proměnných)
  8. cron daemon
    běžně používaný crontab formát s komentáři, nemusí být pro více uživatelů, stačí jeden crontab soubor. Použití základních proměnných v crontab souboru (pro referenci viz třeba cron(5) na FreeBSD), automatické načtení změn.
  9. on-line komunikace
    nabidnete nejake rozumne zadani.
  10. file a process manager
    operace se soubory: vypisování obsahu adresářů (s podrobnými informacemi o souborech), kopírování, mazání a přejmenování souborů, vytváření linků, nastavení práv souborů, zjišťování informací o běžících procesech, interaktivní posílání signálů procesům a pod.
  11. find
    vyberte si rozumnou podmnožinu podmínek a akcí
  12. stahování souborů pomocí HTTP nebo FTP
    dávkové stahování souborů a celých adresářových stromů z FTP a WWW serverů
  13. jednoduchý mail/news systém
    off-line komunikace, posílání a čtení (textových) zpráv mezi uživateli (skupinami uživatelů), volitelně pomocí System V IPC v rámci jednoho systému nebo s využitím soketů po síti
  14. distribuované systémy
    např. pro zpracovaní jednoho dělitelného úkolu na více strojích - sami přijďte s rozumným zadáním.
  15. filtrování pošty
    ukládání došlých mailů do folderů podle zadaných pravidel

Pro inspiraci

Slušně vypracované zápočtové programy z předchozích let:

 


Poslední změna: