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