od jethro » 28. 1. 2015 23:07
Dnes bylo za úkol napsat inetd.
Máme konfigurák tvaru:
<port> <wait|nowait> <cmd>
Počet řádků není nijak omezen, na krásu parsování se nehledí, převod text-> struktura nebyl nijak hodnocen. Můžeme předpokládat, že je korektní
Program na začátku načte konfigurák, nějak ho vypíše na výstup a pak se bindne na porty dle konfigurace a když se na ně něco připojí, tak spustí <cmd> a předá mu spojení:
- nowait -> udělá accept, deskriptory 0,1,2 nastaví na socket z acceptu a execne program (tudíž ten ani neví, že pracuje po síti)
wait -> přímo poslouchací socket nastaví jako deskriptor 0 a execne program (a ten teprve volá accept)
Pokud přijde nový požadavek, tak se u nowait spustí další <cmd>, u wait si ho musí zpracovat <cmd> sám, dokud ten žije, tak se o poslouchací socket inetd nestará, když umře, tak ho při dalším požadavku znovu spustí.
Klíčové věci: getaddrinfo (aby umělo IPv4 i IPv6), poll, zavírat dětem sockety, co nepotřebují, hlídat si mrtvé děti a uklízet po nich.
První to vzdal asi po 4 hodinách, po asi 4:45 to měl první, celkem to dva vzdali a tři udělali, tuším za 2. Já jsem končil s jedničkou asi 21.15.
Přikládám svoje řešení, docela funguje, chybu mi v něm nenašel.
- Přílohy
-
- zk.tar.gz
- Tar se vsim, protoze phpbb je idiot
- (2.82 KiB) Staženo 208 x
-
- test.c
- odpovidatko na wait
- (723 bajtů) Staženo 231 x
-
- inetd.c
- Hlavni program
- (6.84 KiB) Staženo 241 x
Dnes bylo za úkol napsat inetd.
Máme konfigurák tvaru:
<port> <wait|nowait> <cmd>
Počet řádků není nijak omezen, na krásu parsování se nehledí, převod text-> struktura nebyl nijak hodnocen. Můžeme předpokládat, že je korektní
Program na začátku načte konfigurák, nějak ho vypíše na výstup a pak se bindne na porty dle konfigurace a když se na ně něco připojí, tak spustí <cmd> a předá mu spojení:
[list]
nowait -> udělá accept, deskriptory 0,1,2 nastaví na socket z acceptu a execne program (tudíž ten ani neví, že pracuje po síti)
wait -> přímo poslouchací socket nastaví jako deskriptor 0 a execne program (a ten teprve volá accept)
[/list]
Pokud přijde nový požadavek, tak se u nowait spustí další <cmd>, u wait si ho musí zpracovat <cmd> sám, dokud ten žije, tak se o poslouchací socket inetd nestará, když umře, tak ho při dalším požadavku znovu spustí.
Klíčové věci: getaddrinfo (aby umělo IPv4 i IPv6), poll, zavírat dětem sockety, co nepotřebují, hlídat si mrtvé děti a uklízet po nich.
První to vzdal asi po 4 hodinách, po asi 4:45 to měl první, celkem to dva vzdali a tři udělali, tuším za 2. Já jsem končil s jedničkou asi 21.15.
Přikládám svoje řešení, docela funguje, chybu mi v něm nenašel.