[linux] Rura obojsmerna

Ondrej Jombik nepto na pobox.sk
Neděle Duben 27 01:06:37 CEST 2003


> -> Ju taktiez nutne upozornit nato, ze tento softver zatial nevie
> -> workaroundovat (uzasne slovo ;-) rozne bugy v Linuxovom jadre resp.
> -> v samotnom glibc (je na polemiku, ci to vlastne bugy su). Aby som bol
> -> presnejsi, skuste si v lubovolnom shelli toto:
> ->
> ->     $ rev | cat
> ->
> -> Nebude to fungovat, resp. vystup nedostanete az kym nestlacite Ctrl+d.
> -> Naproti tomu toto paradoxne fungovat bude:
> ->
> ->     $ cat | cat
> povedal by som ze je to vlastnost programu, resp libc. libc funkcie
> totiz zvyknu bufferovat vstup/vystup (vazne, skus to prve ale natukaj
> mu napr. 4 kB textu) a program/kniznica si moze ale nemusi zistit ci
> je vstup terminal a prisposobit tomu svoje spravanie.

Ano je to tak, kazdych cca. 4096 bajtov to posle hromadne vystup.

> -> A viem presne preco to tak je, ale to uz presahuje ramec tohto
> e-mailu.
> ak sa mylim tak to radsej napis :) lebo ak to pracuje tak tak to moze
> byt povazovane za bug, alebo dokonca len za nie najlepsiu feature toho
> programu.

Rozdiel medzi aplikaciou "cat" a "rev" je, ze pouzivaju rozne metody
standartneho V/V (I/O). Aplikacia "cat" pracuje priamo
s filedescriptormi, tj. pre citanie a zapis pouziva read() resp.
write() (pre otvorenie a zatvorenie open()/close()).

Aplikacia "rev" vyuziva tzv. stream (FILE*) funkcie z (g)libc. Cize pre
zapis a citanie pouziva cosi na styl fgets()/fputs(). V konecnom
dosledku tieto volania (g)libc zavolaju aj tak systemove read()/write(),
ale neodpustia si pri tom bufferovanie.

Ked vsak na prikazovom riadku spustis len

    $ rev

tak nedostavas vystup kazdy 4096 bajtov. Preco? Lebo stream (FILE*)
volania z (g)libc zdetekuju, ze vstup alebo vystup je terminal a teda
bufferovanie nie je ziaduce. Filedescriptor, ktory vznikol cez pipe()
vsak evidentne do kategorie nebufferovanych vstupov resp. vystupov
nepatri.

Je to bug? Mozno. Z mojho pohladu urcite. Ale napriklad ti, ktori robia
s UNIXom od cias ked som este ani nebol na tomto svete, by to mohli
vediet zdovodnit napriklad nejakymi historickymi okolnostami
a zachovanim spa:tnej kompatibility. Zase na druhej strane je Linux
pomerne novy operacny system a teda nemusel preberat vsetko do
posledneho detailu.

Pisal som o tomto probleme do GLIBC-DEV mailinglistu, ale bez odpovedi.
Bud mi nerozumeli, alebo maju v pazi. Oba varianty su rovnako
pravdepodobne. Moj konzultant rocnikoveho projektu mi doporucil sa nato
vykaslat, pretoze tych bugov je vraj v glibc ovela viac. Ja vsak
o ziadnych inych neviem (problematiku totiz dopodrobna nesledujem).

--
  _/|   Ondrej Jombik - nepto na php.net - http://www.nepto.sk - OJ812-RIPE
 <_  \  Platon SDG - open source software development - http://platon.sk
   `\|  This message was written with Pine, the fastest IMAP mail client
    '`



Další informace o konferenci linux