Is it OK to poll() a device file descriptor

Is it OK to poll() a device file descriptor

Elazar Leibovich elazarl at gmail.com
Wed Jun 19 09:01:13 IDT 2013


I think I didn't explain myself correctly, so let me give a different
example.
Let's make a file descriptor that counts to 9.

I.e, we want to emulate the behavior:

    int fd = make_counter_fd();
    assert(write(fd, buf, 100) == 11);
    assert(strcmp(buf, "0123456789") == 0);

Let me describe a very simple version of the main poll loop:

    struct poll_cb {
        int fd;
        int (*read_cb)(int fd);
        int (*write_cb)(int fd);
    };
    while (poll(&pfd, nr, -1) != -1) {
        for (int i=0; i < nr; i++) {
            if (pfd[i].revent |= POLLIN)
                poll_cbs[i].read_cb(pfd[i].fd);
            if (pfd[i].revent |= POLLOUT)
                poll_cbs[i].write_cb(pfd[i].fd);
            if (pfd[i].revent |= POLLHUP)
                pfds[i].fd = -1; // don't poll again
        }
    }

Now, in order to emulate the 0-9 file descriptor, we'll associate to a
"/dev/zero" a read callback function that looks roughly like

    int written = 0;
    char buf[10];
    int zero_to_nine_cb(int fd) {
        for (int i=0; i< 10; i++) buf[i] = '0' + i;
        close(fd); // note, we never touched the fd
    }

But I have to use a file descriptor! Otherwise poll will have no reason to
call my callback.
On Jun 19, 2013 7:47 AM, "Shachar Shemesh" <shachar at shemesh.biz> wrote:

>  On 18/06/13 22:16, Elazar Leibovich wrote:
>
> I'm using it as a fake "always non-blocking" file descriptor.
>
>  My main libevent-like poll loop looks like:
>
>      poll(fds)
>     for fd in fds:
>        if fd.revents | POLLIN:
>            fd.read_callback()
>        if fd.revents | POLLOUT:
>            fd.write_callback()
>
>  Now let's say I want a fake filedescriptor that always reads 'z's (a
> sleepy fd).
>
> Why? What you just did was to turn the whole thing into a non-sleeping
> loop. If that's the case, simply call poll with a zero timeout, so it won't
> sleep, and call your callback at the end of each loop. No need to
> artificially introduce another file descriptor into the mix.
>
> Mind you, I still don't understand WHY you'd want such a thing. This code
> will, by definition, consume 100% CPU all the time.
>
> Shachar
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.cs.huji.ac.il/pipermail/linux-il/attachments/20130619/b55f47cc/attachment-0001.html>


More information about the Linux-il mailing list