Vynulovani velikosti souboru

Míla Kuchta mila.kuchta na atlas.cz
Sobota Září 2 19:11:43 CEST 2000


Jacek Kopecky <kopeckyj na inf.upol.cz> napsal:
>  > No, teoreticky by to melo byt asi takto:
>  > 1. shell se forkne a execne tail
>  > 2. tail se forkne a pipne cat
>  > 3. shell zavre (dup()) puvodni filedescriptory a otevre nove
>  >   - tady mozna bude ta finta
>  >   - zalezi na tom v jakem poradi to probehne
>  >   - cat totiz ten soubor musi nejak zamknout, nebo ulozit lokalni kopii,
>  >   jelikoz vetsinou pracuje jen s 512 byty.
>  > 4. konzument zacne cist
>  > 5. producent zacne zapisovat.
>  > ....
>  > 
>  > Nerekl bych, ze to to shell osetruje, takze to takhle nejak musi fungovat,
>  > pokud to tedy neni vlastnost jadra, ktere ten soubor fyzicky ihned nezapise,
>  > ale zapise je az pri zadosti o uzavreni descriptoru.
> 
>  Netusim, proc si Milo myslite, ze by mel byt konzument spusten driv
> nez producent. 8-) To je nelogicke a nenese to obecne zadne vyhody.
> Aspon me zadne nenapadaji.

Jednu, a to dosti vyznamnou vyhodu bych videl. Nedostanete SIGPIPE (=zapisovana
data nikdo necte):-)
Take je to vhodne z toho duvodu, ze prvni prikaz na radce muze jako prvni
ukoncit svoji cinnost. Neni totiz vazany na zadny detsky proces a tak jeho
skonceni nemuze ohrozit provadeni kolony.

>  Strace mi prozradil, ze bash2 (2.03.8) vytvori pipe pro spojeni
> procesu, forkne se a execne cat, ten si otevre zadany soubor a vypise
> ho (u maleho souboru to stihne, nez viz dale), to vse v prvnim kvantu.
>  Dale bash2 forkne, otevre zadany soubor s flagem O_TRUNC, coz ten
> soubor vynuluje (zaroven pro vsechny procesy v jednoprocesorovem
> systemu, asi zaroven nebo malem zaroven v SMP), pak filedescriptor
> tohoto souboru preda tailu jako stdout. 
>  Tail si precte, co mu cat poslal do pipe a vypise poslednich 100
> radku. Funguje to u malych souboru, u velkych to bezpecne selze.
> 
>  Cat ten soubor nezamyka ani si neuklada lokalni kopii, jen vzdy nacte
> 512 byte a zase je zapise, jenze pipe v sobe snese az ctyri KiB,
> teprve pak se cat blokne v zapisu. 

Take se mi nezda pravdepodobne, ze by cat ten soubor zamykal. Nemuzu ani
zarucit tento postup u bash2, ale kdysi jsem prochazel zdrojaky kornshellu a
tam to tak bylo. Jednoduse se zavolal pipe, zavrely se descriptory 0,1,2 (podle
situace) a dupem se napojily. Pri jedne roure to bylo jednodussi. Zavrely se
terminalove descriptory a zavolal se pipe ktery obsadil jejich misto.
Shell spoustel jen posledni proces v kolene a vzniknuvsi procesy se klonovaly
dale az k prvnimu.

Muzu to i rozepsat, budeli zajem. Ale rekl bych, ze to bude jadrem:-)

S pozdravem

Mila Kuchta



Další informace o konferenci Linux