python doesn't allow descriptors > 63 in select

Corinna Vinschen
Wed Aug 3 11:04:00 GMT 2011

On Aug  3 12:04, Reini Urban wrote:
> 2011/8/3 Corinna Vinschen:
> >  $ python
> >  socket opened with fd 3
> >  socket opened with fd 4
> >  socket opened with fd 5
> >  [...]
> >  socket opened with fd 62
> >  socket opened with fd 63
> >  socket opened with fd 64
> >  socket opened with fd 64
> >  Traceback (most recent call last):
> >    File "", line 10, in <module>
> >      select(ins, [], [], 0)
> >  ValueError: filedescriptor out of range in select()
> >
> > I debugged this and it turns out that python does not call Cygwin's
> > select function anymore, as soon as there's a file descriptor in the
> > set which is >= 64.
> I have a similar limitation in postgresql, and I heard that this is
> based on a windows limitation, not any predefined constant.
> In postgresql I can max fork 63 worker childs, tested by a configure probe.

I don't know why that is, since Cygwin allows 256 children per process.

Either way, that's not related to select.  Cygwin's select is using a
single WaitForMultipleObjects (WFMO) call at the core.  This WFMO call
is restricted to 63 wait objects.  But many object types are handled by
a common thread, and only this thread is given to WFMO.  So, for
instance, all sockets given to select together take only one waitable
object in the WFMO call.

So far this works for sockets, pipes, fifos, ptys and /dev/log.  All
other objects take one WFMO slot per descriptor.

However, if you restrict your application to 64 objects, you will never
be able to use more, even if Cygwin's select supports that already or
will support it at one point, depending on the descriptor type.


Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Project Co-Leader          cygwin AT cygwin DOT com
Red Hat

Problem reports:
Unsubscribe info:

More information about the Cygwin mailing list