Re: Select with device and stdin not working

From: M. Tavasti (tawz@nic.fi)
Date: Thu Jul 26 2001 - 07:06:24 EST


"Richard B. Johnson" <root@chaos.analogic.com> writes:

> > But now there is nothing coming from device, and typing + pressing
> > enter won't make select() return like it should.
>
> It works here...........

You're testing different thing. You're not reading anything, so at
least I get endlessly 'Input is available from /dev/random', and
whenever you type something, also in terminal there's data available.
If nobody reads data from /dev/random, of course there is data
availble.

I modified your program (see end), and results: on 2.2.19 and 2.2.16
everything works ok, in 2.4.5 not, terminal input (with return)
randomly makes select return. When looking from random.c, in 2.2.19
poll_wait is called once, like this:

        poll_wait(file, &random_poll_wait, wait);

And in 2.4.5:

        poll_wait(file, &random_read_wait, wait);
        poll_wait(file, &random_write_wait, wait);

I think I got idea how to do it right, make one wait queue for poll,
which is woken up when read OR write queue is woken up.

So, now everybody just check your driver how does it do poll.

----

Here is modified test. Try this to get real results:

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/poll.h> #include <errno.h> #include <string.h>

static const char dev[]="/dev/random";

int main(int args, char *argv[]) { int fd, retval; fd_set rfds; char buff[1024];

if((fd = open(dev, O_RDONLY)) < 0) { fprintf(stderr, "Can't open device, %s\n", dev); exit(EXIT_FAILURE); } for(;;) { FD_ZERO(&rfds); FD_SET(fd, &rfds); FD_SET(STDIN_FILENO, &rfds); retval = select(fd+1, &rfds, NULL, NULL, NULL); if(retval < 0) fprintf(stderr, "Error was %s\n", strerror(errno)); printf("Return = %d\n", retval); if(FD_ISSET(fd, &rfds)) { printf("Input is available from %s\n", dev); read(fd,buff,1024); } if(FD_ISSET(STDIN_FILENO, &rfds)) { printf("Input is available from %s\n", "terminal"); read(STDIN_FILENO,buff,1024); } } if(close(fd) < 0) { fprintf(stderr, "Can't close device, %s\n", dev); exit(EXIT_FAILURE); } return 0; }

-- M. Tavasti / tavastixx@iki.fi / +358-40-5078254 Poista sähköpostiosoitteesta molemmat x-kirjaimet Remove x-letters from my e-mail address - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Tue Jul 31 2001 - 21:00:26 EST