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

Matus "fantomas" Uhlar uhlar na fantomas.sk
Středa Únor 6 10:08:28 CET 2002


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

problem je hlavne v tom ze i/o funkcie libc pracujuce s FILE pouzivaju
jednoduchy buffering (tusim ak stdout nie je tty) ktory musis vypnut. pri
'cat' by mal pomoct prepinac '-u' ale aspon moj revp (pozeral som na debiane
aj na FreeBSD) ziaden prepinac nema.

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

prikazu 'rev' by sa zisiel parameter aby vypol buffering.

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

so shellom to nema nic spolocne... je to v 'rev'

-- 
 Matus "fantomas" Uhlar, uhlar na fantomas.sk ; http://www.fantomas.sk/
 Warning: I don't wish to receive spam to this address.
 Varovanie: Nezelam si na tuto adresu dostavat akukolvek reklamnu postu.
 You have the right to remain silent. Anything you say will be misquoted,
 then used against you. 




Další informace o konferenci linux