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