select bug?

Milan Kopacka mkop5230 na ss1000.ms.mff.cuni.cz
Neděle Září 26 22:07:25 CEST 1999


On Sun, 26 Sep 1999, Pavel Kankovsky wrote:

> 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

Ahoj,

objevili jsme jeste zajimavejsi chovani. 

Zapis do cteciho konce vrati (spravne) -1 (jako ze ne). Nasledujici
select() ovsem tento deskriptor suse oznaci jako zapisuschopny. :)
Nicmene, nasledujici zapis opet neuspeje a select si dal stoji na svem.

Nasledujici zapis do zapisoveho konce zapisuzneschopni :) z pohledu
selectu oba konce.

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>

int can_write(int fd)
{
        int ret;
        fd_set fds;
        struct timeval tv = {0, 0};
        FD_ZERO(&fds);
        FD_SET(fd, &fds);
        ret=select(fd + 2, NULL, &fds, NULL, &tv);
        printf("filedescriptors: %ld\n",*fds.fds_bits);
        return ret;
}

int main()
{
        int ret;
        int p[2];
        ret=pipe(p);
        printf("pipe returned %d\n",ret);

        printf("select returned %d\n", can_write(p[1]));

        ret=write(p[0], "x", 1);
        printf("write in p[0] returned %d\n",ret);
        printf("select returned %d\n", can_write(p[0]));

        ret=write(p[0], "x", 1);
        printf("write in p[0] returned %d\n",ret);
        printf("select returned %d\n", can_write(p[0]));

        ret=write(p[1], "x", 1);
        printf("write in p[1] returned %d\n",ret);
        printf("select returned %d\n", can_write(p[1]));
        return 0;
}


Vystup:

pipe returned 0
filedescriptors: 16
select returned 1
write in p[0] returned -1
filedescriptors: 8
select returned 1
write in p[0] returned -1
filedescriptors: 8
select returned 1
write in p[1] returned 1
filedescriptors: 0
select returned 0

Letmym cmuchem do manpage na FreeBSD jsem zjistil, ze umi obousmerne pipy
a pripisuje to SVR4. Nevite, jak je na tom Linux (manpage mi prijde dost
stara).

  Milan Kopačka v tesne spolupraci s Petrem Čechem



Další informace o konferenci Linux