read() a select()(Was: Blokovani v fgets)
Pavel Kankovsky
peak na kerberos.troja.mff.cuni.cz
Úterý Srpen 4 15:55:32 CEST 1998
On Tue, 4 Aug 1998, Michal Krause wrote:
> Ted jsem s tim trosku laboroval a zjistil jsem, ze pokud je otevrena console a
> ne soubor, funkce read() cte automaticky po radcich. Pokud bych ji donutil, aby
> stejne fungovala i na FIFO, mel bych po problemu. Pujde to nejak?
Ne. Terminaly maji tu vlastnost, ze v "cooked" modu jejich ovladac drzi
napsany text az do te doby nez je vyzadano jeho odeslani (enter nebo
ctrl+d). Kdyz se prepne do "raw" modu (stty raw, zpet stty cooked), tak
tuto vlastnost ztrati a chova se jako vsichni ostatni. Nicmene vsechny
roury maji tu vlastnost (ktera by mohla byt uzitecna), ze zapisy ktere
nejsou delsi nez PIPE_BUF jsou atomicke (takze je lze precist najednou).
U datagramovych socketu je pri pouziti send() a recv() mozno spolehlive
rozlisit jednotlive casti i prijimajici strane.
> Mam ale navic problemy se selectem. Prikladam programek, ktery funguje jak ma
> pouze za predpokladu, ze stdin je nepresmerovan - tedy je to klavesnice. Pokud
> se program spusti treba takhle: ./select <file, tak dojede na konec souboru a
> funkce select() by mela program stopnout az do timeoutu, coz ale neudela. U
> souboru je to pomerne logicke, ale u FIFO se da predpokladat, ze data budou
> pribyvat, takze by mela blokovat. Nevi nekdo co s tim?
Jakmile je FIFO jednou zavreno (tj. pocet otevreni pro zapis klesne k
nule), tak je zavreno a nikdo z nej uz nikdy nic neprecte. Je pripadne
nutno FIFO znovu otevrit.
--Pavel Kankovsky aka Peak [ Boycott Microsoft--http://www.vcnet.com/bms ]
"You can't be truly paranoid unless you're sure they have already got you."
Další informace o konferenci Linux