Date: Fri, 6 Jul 2001 17:44:03 +0300 From: Peter Pentchev <roam@orbitel.bg> To: Matthew Hagerty <mhagerty@voyager.net> Cc: freebsd-hackers@FreeBSD.ORG Subject: Re: Proper use of select() parameter nfds? Message-ID: <20010706174403.C700@ringworld.oblivion.bg> In-Reply-To: <5.0.2.1.2.20010706095736.0233de30@pop.voyager.net>; from mhagerty@voyager.net on Fri, Jul 06, 2001 at 09:58:00AM -0400 References: <5.0.2.1.2.20010706095736.0233de30@pop.voyager.net>
next in thread | previous in thread | raw e-mail | index | archive | help
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 majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010706174403.C700>