[fpc-pascal] fpselect does not work on linux

fpclist at silvermono.co.za fpclist at silvermono.co.za
Sat May 9 12:51:14 CEST 2009


According to the FPC rtl.pdf version 2.2.2 Doc version 2.1 of June 2008, page 
165, states, and I quote: "Description:FPSelect checks one of the file 
descriptors in the FDSets to see if its status changed."

//-------------------------------------------------------------------------

On Saturday 09 May 2009 12:50:03 Michael Van Canneyt wrote:
> On Sat, 9 May 2009, Rainer Stratmann wrote:
> > Am Samstag, 9. Mai 2009 12:17 schrieb Michael Van Canneyt:
> > > On Sat, 9 May 2009, Rainer Stratmann wrote:
> > > > To find out if a nonblocking socket has connected I use the following
> > > > piece of code:
> > > >
> > > > With windows that works, but with linux I get alwas the result that
> > > > the socket is writable.
> > > >
> > > > function is_writable_socket( sck : integer ) : boolean;
> > > > var
> > > >   fds : tfdset;
> > > >   tv  : timeval;
> > > > begin
> > > >   {$ifdef linux}   fpfd_zero( fds ); fpfd_set( sck , fds ); {$endif}
> > > >   {$ifdef windows}   fd_zero( fds );   fd_set( sck , fds ); {$endif}
> > > >   tv.tv_sec  := 0;
> > > >   tv.tv_usec := 0;
> > > >   //                 socket+1 , read , write , except , timeout
> > > >   {$ifdef linux}
> > > >   result := fpselect( sck + 1 , nil  , @fds  , nil    , @tv ) > 0;
> > > >   {$else}
> > > >   result :=   select( sck + 1 , nil  , @fds  , nil    , @tv ) > 0;
> > > >   {$endif}
> > > > end;
> > >
> > > And why do you think that this is a bug ?
> >
> > I know that the socket I tested is not writable, but the function returns
> > writable... always with linux.
> >
> > It is not working on linux operating system. With windows os that works.
> >
> > Someone else have (had?) exactly the same problem:
> > http://community.freepascal.org:10000/bboards/message?message_id=270583&f
> >orum_id=24083
>
> The call functions correctly, IMHO, but the behaviour of the call is not as
> you expect.
>
> Select does *not* tell you if a file descriptor is writeable or readable.
> It tells you if the read/write operation will block.
> This is something subtly different.
>
> For instance, it reports file descriptor 0 as writable, which is rather
> strange, since it is read-only, but correct, because the write call will
> not block. Indeed the write call will return at once with an error
> condition.
>
> This is what the kernel sees (I used strace to test your code with
> descriptor 0):
>
> select(1, NULL, [0], NULL, {0, 0})      = 1 (out [0], left {0, 0})
>
> Which is exactly what I sent.
>
> In short, is_writable_socket should be implemented differently, not using
> select.
>
> Michael.
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal




More information about the fpc-pascal mailing list