select bug?

Pavel Machek pavel na bug.ucw.cz
Úterý Září 28 11:09:23 CEST 1999


Ahoj!


> : Chovani funkce select na pipy v linuxu mi prijde podivne.
> 
> Hm - zaujimave. Chvilu som sa s tym hral a select
> vrati true skutocne az vtedy, ked je _vsetko_
> z pipy precitane. T.j. ak zapisem 2 bytes
> a precitam 1, select vrati 0. Az precitam
> dalsi, bude tam 1.
> 
> Skusil som to aj medzi procesmi - funguje
> to rovnako.
> 
> Ako "dovod" tipujem, ze zapisy do velkosti PIPE_BUF
> musia byt atomicke, v jadre je iba buffer tejto
> dlzky a niekomu sa mozno nechcelo sa s tym
> babrat (uz som sa tam raz vrtal, ked som nahanal
> mrznuci Netscape).
> 
> IMHO jasny kandidat na otazku do linux-kernel.
> Poslete ju Vy, alebo mam pripadnu blamaz
> riskovat sam? :-)

Nechcete se pro zacatek podivat do zdrojaku?

...

...

pipe_poll(struct file *filp, poll_table *wait)
{
        unsigned int mask;
        struct inode *inode = filp->f_dentry->d_inode;

        poll_wait(filp, PIPE_WAIT(*inode), wait);

        /* Reading only -- no need for aquiring the semaphore.  */
        mask = POLLIN | POLLRDNORM;

        if (PIPE_EMPTY(*inode))
                mask = POLLOUT | POLLWRNORM;
	####################################

        if (!PIPE_WRITERS(*inode))
                mask |= POLLHUP;
        if (!PIPE_READERS(*inode))
                mask |= POLLERR;

        return mask;
}

Vypada to ze pollwrnorm se opravdu vraci az kdyz je pipa prazda... A
rekl bych ze PIPE_BUF je opravdu tim duvodem.

-- 
I'm really pavel na ucw.cz. Look at http://195.113.31.123/~pavel.  Pavel
Hi! I'm a .signature virus! Copy me into your ~/.signature, please!


Další informace o konferenci Linux