Hello!

I'm finding that I have a need to select on a win32 handle. I found the
function cygwin_attach_handle_to_fd which sounded promising, but I do
not have any luck when I try to use it.

I did look through the sources in winsup, but came to the perhaps
misguided conclusion that there needs to be a new fhandler in order to
support this.

I would not mind to be proved wrong though. :-)

I was hoping that the following program would print "tick" with one
second intervals, but the fd is selectable all the time. If I
uncomment the call to WaitForSingleObject, the output is as I hoped,
so I believe the Win32 parts are correct in the sample.

I have tried various arguments instead of NULL for
cygwin_attach_handle_to_fd, in the hopes of finding a workable
fhandler, but to no avail.

Is there some other approach to select on Win32 handles? Or should
I declare defeat and use get_osfhandle on the fds and WaitFor...
the combined set of fds/objects that way instead?

Cheers,
Peter

-------------8<------------

#include <windows.h>

#include <stdio.h>
#include <unistd.h>
#include <sys/cygwin.h>

int
main(void)
{
        HANDLE timer;
        LARGE_INTEGER due;
        int fd;
        fd_set fds;
        int i;
        int res = 0;

        timer = CreateWaitableTimer(NULL, TRUE, NULL);
        due.QuadPart = -10000000;
        if (!SetWaitableTimer(timer, &due, 0, NULL, NULL, FALSE))
                return -1;

        fd = cygwin_attach_handle_to_fd(NULL, -1, timer, 1, GENERIC_READ);

        if (fd < 0) {
                CloseHandle(timer);
                return -1;
        }

        FD_ZERO(&fds);
        FD_SET(fd, &fds);

        for (i = 0; i < 5; ++i) {
                res = select(fd + 1, &fds, NULL, NULL, NULL);
                if (res < 0)
                        break;
                printf("tick\n");
                /* WaitForSingleObject(timer, INFINITE); */
                if (!SetWaitableTimer(timer, &due, 0, NULL, NULL, FALSE)) {
                        res = -1;
                        break;
                }
        }

        close(fd);

        return res < 0 ? res : 0;
}

-------------8<------------

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

Reply via email to