Problem s named pipe

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Sobota Prosinec 29 20:21:03 CET 2001


On Fri, 28 Dec 2001, Marián Kyral wrote:

> Po prvním pokuse jsem zjistil, že bzip2 neumí pakovat ze standartního
> vstupu.

Jak uz bylo receno, bzip2 umi cist ze standardniho vstupu. Ale nesmi se
mu dat -c, protoze pak sverepe trva na zadani jmena souboru.

> [root na nest SOURCES]# mkfifo roura
> [root na nest SOURCES]# gzip -dc gimp-data-extras-1.2.0.tar.gz >> roura & bzip2 
> -czk roura >gimp-data-extras-1.2.0.tar.bz2
> [1] 13127
> [1]+ Přerušena roura (SIGPIPE) gzip -dc gimp-data-extras-1.2.0.tar.gz
> >> roura
> 
> příkaz je samozdřejmě na jednom řádku.

Na tom pochopitelne nezalezi, jestli je to na jednom radku nebo ne.

Pri provadeni tohoto prikazu se stane nasledujici:

1. instance shellu, ktery ma za ukol spustit gzip, se pokusi otevrit rouru
   pro zapis, nacez se zablokuje
2. bzip2 otevre rouru pro cteni, coz odblokuje shell z bodu 1
3. je spusten gzip
4. bzip2 z nejakeho ne zcela pochopitelneho duvodu rouru uzavre (*)
5. gzip se pokusi zapsat do roury, ale ta je uz uzavrena, takze dostane
   pres cumak a skonci prave s tim SIGPIPE
6. bzip2 rouru znovu otevre pro cteni, cimz se zablokuje, protoze
   do roury nikdo nechce zapisovat

Chyba je v tom, ze bzip2 vstupni soubor otevira nadvakrat, coz nejde
s semantikou pojmenovanych rour zcela dohromady. Aby to fungovalo, bylo
by nutno bud zapisovat dvoufazove (jednou pouze otevrit a zavrit a pak
teprve zacit opravdu zapisovat), nebo rouru drzet otevrenou pro cteni bez
ohledu na to, co s ni provadi bzip2.

Aha...ted, kdyz se divam do zdrojaku bzipu, tak vidim, ze to ma asi na
svedomi funkce fileExists() v bzip2.c, ktera existenci souboru zjistuje
rafinovane tim, ze se ho pokusi otevrit pro cteni. Asi by to chtelo
autorum vysvetlit, ze to neni nejlepsi napad.

(*) jina mnou testovana verze v tomto miste jeste provede lstat(), zjisti,
ze roura neni regulerni soubor a skonci

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux