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