On Fri, Jul 06, 2001 at 09:58:00AM -0400, Matthew Hagerty wrote:
> Greetings,
>
> I am going over the use of select() for a server I'm writing and I
> *thought* I understood the man page's description for the use of the first
> parameter, nfds.
>
> From MAN:
>
> The first nfds descriptors are checked in each set; i.e., the descriptors
> from 0 through nfds-1 in the descriptor sets are examined.
>
>
> I take this to mean that each descriptor set contains n descriptors and I
> am interested in examining the first nfds descriptors referenced in my
> sets. I also understood it to mean that nfds has absolutely nothing to do
> with the actual *value* of a descriptor, i.e. the value returned by
> fopen(), socket(), etc.. Is this correct thinking? What got me
> second-guessing myself was a use of select() that seems to indicate that
> you have to make sure nfds is larger than the value of the largest
> descriptor you want checked. Here is the select() from the questionable
> code (I can provide the whole function if necessary, it's not very big):
>
> if (select(conn->sock + 1, &input_mask, &output_mask, &except_mask,
> (struct timeval *) NULL) < 0)
Actually, this is the correct use. nfds should be larger than
the value of the largest fd in the set, no matter how many fd's
there are.
> Is this improper use? conn->sock is set like this:
>
> /* Open a socket */
> if ((conn->sock = socket(family, SOCK_STREAM, 0)) < 0)
>
>
> Any clarification on how nfds should be set would be greatly appreciated.
Maybe it would help if you thought of an fd set as of a bit array,
with a '1' bit for each fd "in" the set, and a '0' for each fd
not "in" the set. The nfds argument tells select(2) how far into
the bit array to check for set bits. If you want to check fd's 0,
1 and 5, then nfds should be at least 6.
For more information, I would suggest reading W. Richard Stevens' book
"Unix Network Programming", vol. 1.
G'luck,
Peter
--
You have, of course, just begun reading the sentence that you have just finished
reading.
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message