[linux] Zatuhnutie programu na write()

Ondrej Jombik nepto na pobox.sk
Čtvrtek Duben 11 01:45:20 CEST 2002


                                        Maxim, 21:46:07
                                        10. april 2002 (streda)
Dobry den!

> > ...
> > select(1024, [0 5], [1 4], [], NULL)    = 4 (in [0 5], out [1 4])
> > read(0, "ody:x:99:99:Nobody:/:\nalias:x:40"..., 5000) = 5000
> > write(4, "ody:x:99:99:Nobody:/:\nalias:x:40"..., 5000
> > [tuto to zatuhlo]
> > 	Lenze mne select() vrati vo writefds 4 a na write(4) sa zablokuje.  
> > Netusite niekto, v com moze byt problem? Nevadi tomu ten read(0) medzi tym?
> Pozor, mozno sa tam da zapisat len jeden znak, ale zapisat sa tam da.
> Nijakym sposobom (mne znamim) sa neda zistit, kolko znakov sa tam da
> zapisat, mozete to robit len tak, ze zapisete jeden znak a potom sa znovu
> opytate.

	Dakujem Vam za odpoved. Velmi mi to pomohlo. Mate 100% pravdu.  
Cudujem sa, ze ma to sameho nenapadlo. :-)

	Velkost bufferu som mal nastavenu kvoli "vykonu" na 5000. Akonahle 
som ju zmensil na desatinu, tj. 500 program sa zasekol o par desatin sekund 
neskor. Ked som zmesil buffer na stotinu, tj. 50, funguje to bezchybne az 
doteraz.

	Jeden parameter s velkostou buffra to teda riesi. Akurat, ze buffer
bude dynamicky a nie staticky ako tomu bolo doteraz.

	Co ma vsak trapi je to, ze je tam stale moznost zablokovania
write(). Keby som chcel spravit nepriestrelny program, musel by som zrejme
ako pisete zavolat select() a potom zapisat cez write() jeden bajt. Takto to
opakovat, az kym by nebolo vsetko potrebne zapisane.

	Lenze to je pre 5000 bajtov 2 x 5000 = 10000 syscallov! A to je uz
trosku tuha kava. Naozaj sa neda zistit, kolko sa tam do toho descriptoru
zmesti? Nechce sa mi verit, zeby to neslo. Asi sa budem priamo do utrob
systemu, len ked ja tam tak nerad chodim. ;-)

	=Nepto=
____________________________________________________________________________
Ondrej 'Nepto' Jombik, Perl CGI developer                 #!/usr/bin/perl -w





Další informace o konferenci linux