select bug?

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Neděle Září 26 12:43:56 CEST 1999


On 25 Sep 1999, Mikulas Patocka wrote:

> Chovani funkce select na pipy v linuxu mi prijde podivne.
> Kdyz do pipy neco zapisu a pak ji otestuju selectem pro
> zapis, tak nebude vybrana (ackoli by mela byt vybrana,
> pokud neni zcela zaplnena). Prikladam programek, ktery to
> demonstruje - na Linuxu vrati nulu a na ostatnich systemech
> (zkousel jsem BSD, OS/2, Solaris) vrati 1 - pipa je radne
> vybrana.

Kupodivu to ma jistou logiku. To, ze select() oznaci nejaky deskriptor za
prace schopny by melo znamenat, ze nejblizsi operace zapisu resp. cteni na
nem provedena bude schopna zapsat resp. precist aspon jeden bajt. Jinak
receno tato operace aspon castecne uspeje (aniz by se zablokovala). Jenze
semantika zapisu do rour je takova, ze zapisy, jejich delka neni vetsi nez
PIPE_BUF, jsou atomicke, tj. jsou bud zcela neuspesne (EAGAIN) nebo zcela
uspesne (po pripadnem zablokovani). Protoze je velikost rouroveho bufferu
presne PIPE_BUF, nemuze select() tvrdit, ze je roura zapisu schopna, pokud
neni buffer zcela prazdny, protoze ten, kdo by tam pak zapisoval, by se
mohl dockat neprijemneho prekvapeni: bud by se write() zablokoval, nebo by
selhal, coz by v typickem pripade znamenalo, ze by se zapisujici proces
zacal cyklit mezi select(), ktery rika ano, a write(), ktery rika ne.

Jisty vychodiskem je pouzivat buffer, ktery bude ve skutecnosti delsi nez
PIPE_BUF, resp. zmensit PIPE_BUF (ktery je na Linuxu celych 4096, i kdyz
minimalni hodnota povolena Posixem je tusim pouze 512).

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