Napište program, který zadaný seznam IP adres převede na seznam jejich doménových jmen. Protože však překlad IP adresy na jméno bývá pomalý (v případě exotických jmen to může trvat i několik sekund), použijte paralelního zpracování několika podprocesy.
Řídící proces po startu pomocí příkazu fork(2)
spustí několik
svých podprocesů, které si propojí pomocí pipe(2)
. Poté
čte standardní vstup, IP adresu na řádku pomocí funkce
inet_pton
převede na strukturu struct in_addr
,
dále zavolá select(2)
, kterým zjistí, který podproces
je ochotný požadavek zpracovat, a tomu pomocí write(2)
pošle in_addr
strukturu.
Dítě, operující nad daným filedescriptorem, čte v cyklu
pomocí read(2)
, dokud nenarazí na konec vstupu
(read(2)
vrátí 0) a zadanou in_addr
strukturu
převede na DNS jméno pomocí volání gethostbyaddr
.
IP adresu a DNS jméno (případně chybu) poté vypíše na standardní výstup.
Řídící program po dočtení vstupu uzavře všechny otevřené
filedescriptory a poté počká na korektní ukončení každého podprocesu
pomocí funkce wait(2)
.
pipe
, jinak
read
v podprocesu nikdy nevrátí EOF.
FD_SET
musíte konstruovat před každým voláním funkce
select(2)
. Tato funkce vám ponechá nastavené ty
filedescriptory, které nemají plný buffer, čili je možné
do nich zapsat bez zdržení.
perl -e 'print int(rand(255)).".".int(rand(255)).".".int(rand(255)).".".int(rand(255))."\n" for(1..10)' | ./dns
Dva kladné body získáte, pokud bude zdrojový kód kratší než 100 řádků. Vzorové řešení má 60 řádků (bez komentářů) a je vám k dispozici ve spustitelné podobě pro nymfy a aisu.
"Vzorové" řešení jsem omylem zkompilovat s
příliš velkou konstantou POOL, čímž program z jakýchsi bezpečnostních důvodů
na školních počítačích nefungoval.
Na stejných adresách jsou nyní uloženy opravené binárky.
Poučení: Kontrolovat, kontrolovat, kontrolovat! ;-)