====== Vytváření procesů v C a překlad make ====== ===== Domácí příprava ===== Předpokládáme, že máte základní znalosti jazyka C a jak funguje překlad ze zdrojových kódů jazyka C do binární spustitelné aplikace (v obecném případě kdy je zdrojových souborů více). Dále byste měli mít alespoň minimální povědomí o použití překladače **gcc** a jeho základních parametrech ([[courses:b4b35osy:cviceni:gcc|]]). Nastudujte si použití nástroje **make** pro překlad programu v jazyku C/C++: [[courses:b4b35osy:cviceni:make]] Dále je pro absolvování cvičení nutné mít přehled o systémových voláních fork, pipe, dup, open, kill, wait a exec, tzn. měli byste vědět jak vzniká nový proces a jak lze přesměrovat standardní vstup a výstup. Potřebné informace se dozvíte na některé z předchozích přednášek. ===== Zadání ===== Vytvořte v jazyce C (nebo C++) program ''forkpipe'', který: * Vytvoří dva procesy (potomky) voláním funkce ''fork''. Prvně vytvořený proces budeme níže nazývat GEN, druhý NSD. * Tyto potomky propojí rourou (funkce ''pipe'' a ''dup2'') tak, aby standardní výstup GEN byl napojen na standardní vstup NSD. * Poté počká 5 sekund pomocí volání ''sleep(5)''. * Poté pošle procesu GEN signál ''SIGTERM'', který způsobí ukončení obou potomků. * //Poznámka:// GEN skončí díky obsluze signálu -- viz níže, NSD by pak měl skončit automaticky také, neboť při ukončení GEN OS uzavře rouru a NSD je naprogramován tak, že skončí při uzavření standardního vstupu. * Následně počká na ukončení procesů GEN a NSD (např. pomocí funkce ''wait''). * Pokud libovolný z potomků skončil chybou (návratový kód != 0), vypíše na standardní výstup řádku "ERROR" a skončí s návratovým kódem 1, v opačném případě vypíše tamtéž řádku "OK" a skončí s kódem 0. * Pokud libovolné systémové volání vrátí chybu, okamžitě skončí s návratovým kódem 2. * GEN bude na standardní výstup vypisovat řádky obsahující dvě mezerou oddělená náhodná čísla vygenerovaná funkcí ''rand()'' (např. ''printf("%d %d\n", rand(), rand())''). * Mezi výpisem řádek bude GEN čekat jednu sekundu pomocí volání ''sleep(1)''. * GEN bude reagovat na signál SIGTERM. Při zaslání tohoto signálu GEN vypíše na standardní chybový výstup řádku "GEN TERMINATED" a skončí s návratovým kódem 0. * NSD zavolá funkci ''execl'', aby začal vykonávat program ''nsd'' (viz níže). Vytvořte ''Makefile'', který: * Při spuštění příkazu ''make'' bez parametrů zkompiluje váš program ''forkpipe'' a program ''nsd'' pro výpočet největšího společného dělitele, jehož zdrojové kódy si stáhněte z {{:courses:b4b35osy:cviceni:nsd.tgz|}}. Obě binárky program umístí do stejného adresáře jako soubor ''Makefile''. * Při změně libovolného zdrojového souboru ''make'' překompiluje pouze soubory, které jsou z daného souboru generovány (ať přímo či nepřímo). Ostatní generované soubory měněny nebudou. * Překladači jazyka C vždy předá volbu ''-Wall'', která způsobí výpis užitečných varování. ==== Poznámky k implementaci: ==== * Rouru musíte vytvořit dříve než potomky, abyste je s ní mohli propojit. * Po vytvoření potomků rodičovský proces rouru nepotřebuje a může ji uzavřít. * Uzavírejte důsledně všechny file descriptory, které již nebudete potřebovat. Předejdete tím záludným chybám. * Z funkce obsluhující signál (tzv. signal handler) není možné volat libovolnou funkci. Viz ''man signal-safety''. * Pro ladění programu se vám můžete hodit příkaz ''strace -f''. Vyzkoušejte také argumenty ''-e process'', ''-e file'', ''-e trace=dup2'', apod. * Odevzdávejte všechny soubory zabalené v archivu. Můžete použít příkaz ''tar czf osy04.tgz Makefile *.[ch]''. ==== Aplikace nsd ==== Zdrojové kódy aplikace nsd se skládají ze souborů nsd_main.c, nsd.c a nd.c a hlavičkových souborů nsd.h a nd.h. Jejich přeložením vytvoříte binární soubor 'nsd'. Zdrojové soubory naleznete v archivu {{:courses:b4b35osy:cviceni:nsd.tgz|}} ===== Domácí příprava na další cvičení ===== Pro další cvičení budete potřebovat vědět * co jsou vlákna, * jaké problémy mohou nastávat při paralelních běhů vláken, * jaké synchronizační prostředky máme k dispozici a * jak je vytvoříme v jazyce c s využitím knihovny **pthread**. Potřebné informace byste měli získat na přednáškách.