[linux] Nebufferovana rura (pipe(), dup2(), fstat64() problemy)

Ondrej Jombik nepto na pobox.sk
Úterý Únor 5 22:50:44 CET 2002


                                        Maxim, 16:46:37
                                        05. februar 2002 (utorok)
Zdravim.

	Uz dlhsiu dobu sa potykam s jednym problemom a kedze ani dnesne 
parhodinove studovanie zdrojakov jadra mi vela nedalo (iba kopu teorie), 
rozhodol som sa podelit sa s vami o moj problem. :-)

	Koho nezaujimaju moje zdhlave opisy, doporucujem preskocit na 
koniec do sekcie jednoduchy opis.


ZLOZITY OPIS
------------

	Cele moje snazenie smeruje k vytvoreniu nebuferovanej rury. Ide o
to, ze si povytvaram tri rury cez pipe(), fork()-nem vlastnu aplikaciu, v
potomkovi (childe) potom spravne konce tychto rur dup2()-nem namiesto
zakladnych filedescriptorov (0, 1, 2). Na zaver v potomkovi spustim
aplikaciu cez execve().

	V tomto stadiu ocakavam, ze aplikacia "komunikuje" prostrednictvom
spravnych koncov mojich rur. Funguje to, ale... Stream-based aplikacie (tj.  
take co pouzivaju FILE* funkcie) pouzivaju akusi cudnu formu bufferovania.  
Napr. 'rev' data precita ale zapise ich az ked ma plny buffer (4096b).  
Nemusis zdoraznovat, ze 'rev' sa tak standartne na terminale (tty) nesprava.

	Kamarat 'strace -f -v' mi povedal, ze problem je v tom, ze fstat64()  
vracia v parametri pracovnej struktury st_mode=S_IFIFO|0600. Ak sa spusti
'cat | rev' tak pre vystup 'rev' fstat64() vrati st_mode=S_IFCHR|0600 a 
vsetko funguje tak ako ma. Skusal som zmenit mod pomocou fchmod() syscallu, 
ale to mi nepomohlo, pretoze S_IFIFO zmenit na S_IFCHR nemozem. :(

        Ako to tak po sebe citam, som skepticky k tomu, ze ma niekto chape.
:-) Preto sa spytam po lopate:


JEDNODUCHY OPIS
---------------

	Ako je mozne, kazdy z tychto riadkov (v bash-i, ash-i) funguje (pri 
standartnej komunikacii cez terminal):

rev
cat
cat | rev
cat | cat | rev

	A ako je mozne, ze kazdy z tychto riadkov nefunguje:

rev | cat
rev | cat | cat
cat | rev | cat

	Nie je to nahodou nejaky bug? Ak ano kde? V jadre? V shelli? V
aplikacii? Ak ano, v ktorej, cat alebo rev? Je to vobec bug?

	Tiez by som chcel poziadat tych, ktorym to v "nejakom" shell-i
funguje, aby mi jeho nazov a verziu poslali. Zaroven sa ospravedlnujem, ak
niekomu pripadam, akoby som prave objavil Ameriku, ale fakt si to neviem
rozumne vysvetlit a co je najhorsie ani neviem, kde mam vysvetlenie hladat.

	Dakujem.

	=Nepto=
____________________________________________________________________________
"Be conservative in what you do, be liberal in what you accept from others."
(RFC 793: Transmission control protocol; chapter 2.10. Robustness Principle)







Další informace o konferenci linux