Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 8 Jul 1999 16:10:51 -0400 (EDT)
From:      "John W. DeBoskey" <jwd@unx.sas.com>
To:        freebsd-hackers@freebsd.org
Subject:   Strange select/poll behaviour [EBADF inconsistancy]
Message-ID:  <199907082010.QAA06869@bb01f39.unx.sas.com>

next in thread | raw e-mail | index | archive | help
Hi,

   The following program returns an inconsistant rc/errno value.
Setting a bit corresponding to filedescriptor which is not open
is only found when it is less than 20. ie:

   Some example output follows along with the program. This is being
run on a -current system. If I open a file on fd 1023 then I receive
EBADF all the way through which is what I expect. Our product depends
on this behaviour (no, don't ask)...

   The man page specfies:
                                          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've seen that select seems to call poll, but I haven't trace
all the way through poll yet.

   Any comments, critiques, or stupid user pointers are appreciated.

Thanks!
John

[    3] : Bad file descriptor
[    4] : Bad file descriptor
[    5] : Bad file descriptor
[    6] : Bad file descriptor
[    7] : Bad file descriptor
[    8] : Bad file descriptor
[    9] : Bad file descriptor
[   10] : Bad file descriptor
[   11] : Bad file descriptor
[   12] : Bad file descriptor
[   13] : Bad file descriptor
[   14] : Bad file descriptor
[   15] : Bad file descriptor
[   16] : Bad file descriptor
[   17] : Bad file descriptor
[   18] : Bad file descriptor
[   19] : Bad file descriptor
[   20] Timeout
[   21] Timeout
[   22] Timeout
[   23] Timeout
[   24] Timeout
[   25] Timeout

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/stat.h>

static struct timeval nowait_s = {0, 0};  /* poll, no wait */
static struct timeval   wait_s = {0, 100};  /* poll,  wait 1 sec*/

fd_set local_rfd;
fd_set local_wfd;

main()
{

   int    n;

   struct timeval  *tp;
   int    max_fd = -1;
   int    count;
   int    bytes;
   int    wait_time;
   int i;
   char * p;
   char buffer[256];

 fprintf(stderr,"FD_SETSIZE = %d\n",FD_SETSIZE);
 for(i=3;i<40;++i)
    close(i);

 for(i=3;i<40;i++)
   {

   bzero(&local_rfd,sizeof(local_rfd));
   bzero(&local_wfd,sizeof(local_wfd));

   FD_SET(i,&local_rfd);

   tp = &wait_s;

   n = select (200,&local_rfd, 0, 0, tp);

   if (n < 0 )
      {
      sprintf(buffer,"[%5d] ",i);
      perror(buffer);
      continue;
      }

   if (n ==  0 )
      {
      printf("[%5d] Timeout\n",i);
      }

    if (n > 0)
       {
       if ( FD_ISSET(0, &local_rfd) )
          {
          printf("[    0]  READ\n");
          }

       if ( FD_ISSET(i, &local_rfd) )
          {
          printf("[%5d]  READ\n",i);
          }
       }
   }
}



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?199907082010.QAA06869>