Vynulovani velikosti souboru

Jacek Kopecky kopeckyj na inf.upol.cz
Sobota Září 2 17:01:05 CEST 2000


 > 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.
 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. 

                            Jacek Kopecky
-- 
http://www.inf.upol.cz/~kopeckyj      ICQ: 49514837
Finger  kopeckyj(at)alpha.inf.upol.cz for Geek Code.



Další informace o konferenci Linux