From: Paul Marquis <pmarquis@iname.com>
To: root@chaos.analogic.com
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: Re: select() bug
Date: Fri, 03 Nov 2000 00:00:21 -0500 [thread overview]
Message-ID: <3A024665.32AFD93@iname.com> (raw)
In-Reply-To: <Pine.LNX.3.95.1001102195118.19271A-100000@chaos.analogic.com>
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/
next prev parent reply other threads:[~2000-11-03 5:00 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2000-11-02 22:11 select() bug Paul Marquis
2000-11-02 22:27 ` Alan Cox
2000-11-02 22:42 ` Richard B. Johnson
2000-11-02 22:58 ` Paul Marquis
2000-11-03 0:53 ` Richard B. Johnson
2000-11-03 5:00 ` Paul Marquis [this message]
2000-11-03 13:05 ` Richard B. Johnson
2000-11-02 22:53 ` Paul Marquis
2000-11-02 22:58 ` Alan Cox
2000-11-02 23:08 ` Paul Marquis
2000-11-02 23:20 ` Alan Cox
2000-11-02 23:44 ` Paul Marquis
2000-11-02 23:53 ` H. Peter Anvin
2000-11-02 23:46 ` David S. Miller
2000-11-03 0:04 ` H. Peter Anvin
2000-11-02 23:52 ` David S. Miller
2000-11-03 0:13 ` H. Peter Anvin
2000-11-03 0:05 ` David S. Miller
2000-11-03 0:38 ` H. Peter Anvin
2000-11-03 0:01 ` Alan Cox
2000-11-02 23:55 ` Alan Cox
2000-11-03 5:52 ` dean gaudet
2000-11-03 7:05 ` Marc Lehmann
-- strict thread matches above, loose matches on Subject: below --
2000-11-05 16:14 Stanislav Meduna
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3A024665.32AFD93@iname.com \
--to=pmarquis@iname.com \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=root@chaos.analogic.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox