Warning
This page is located in archive. Go to the latest version of this course pages.

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 (gcc).

Nastudujte si použití nástroje make pro překlad programu v jazyku C/C++: 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 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 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.

courses/b4b35osy/cviceni/cviceni4_c.txt · Last modified: 2017/10/26 15:40 by sojkam1