Messages in this thread |  | | Date | Fri, 03 Nov 2000 00:00:21 -0500 | From | Paul Marquis <> | Subject | Re: select() bug |
| |
It shows that even though select() says a file descriptor is not writable, a write() can still succeed. This code is not used anywhere in the real world, or at least my real world :-P. It just demonstrates "the bug".
Richard B. Johnson" wrote: > Not as I see it. This is clearly a code bug. Look: > iteration 1 > select says pipe is writable > write succeeded - 1 bytes written > iteration 2 > select returned 0 -- pipe not writable > > for (i = 0; i < 4; i++) > { > printf("iteration %d\n", i + 1); > > status = 0; > > /* do select */ > FD_ZERO(&write_fds); > FD_SET(fd[1], &write_fds); > tv.tv_sec = 0; > tv.tv_usec = 0; > switch (select(fd[1] + 1, NULL, &write_fds, NULL, &tv)) > { > case -1: > /* should probably check for EINTR and/or EWOULDBLOCK */ > printf("select error - %s\n", strerror(errno)); > break; > case 0: > /* no I/O */ > puts("select returned 0 -- pipe not writable"); > break; > > The BREAK breaks out of the switch-statement --- > | > |----------------------------------------------------------- > | > | default: > | /* make sure our fd is writable */ > | if (FD_ISSET(fd[1], &write_fds)) > | { > | puts("select says pipe is writable"); > | status = 1; > | } > | else > | puts("select says pipe is not writable"); > | break; > | } > | > | /* do write */ > |-------> n = write(fd[1], buf + (i % 2), 1); > > Then you write it anyway! > > write succeeded - 1 bytes written > select bug > > Cheers, > Dick Johnson > > Penguin : Linux version 2.2.17 on an i686 machine (801.18 BogoMips). > > "Memory is like gasoline. You use it up when you are running. Of > course you get it all back when you reboot..."; Actual explanation > obtained from the Micro$oft help desk.
-- Paul Marquis pmarquis@iname.com - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/
|  |