On Fri, 2005-03-11 at 13:41, Gus Koppel wrote:
> Iago Rubio wrote:
> 
> > > > i get the message
> > > >   *** GLib *** : poll(2) failed due to: Invalid argument.
> > > > thousand times when running my application.
> > > > It seems that it happens if i have accepted 100 < x < 200
> > > > tcp connection from which i listen for input.
> > > > 
> > > > What can i do? I am using glib 2.6.0 on a linux system.
> > > 
> > > I've did some investigation, and it appears that glib runs into
> > > an endless loop when it tries to poll more than 256 fds at once.
> > 
> > It makes sense ... read /usr/include/linux/limits.h 
> > 
> > #define OPEN_MAX         256    /* # open files a process may have */
> > 
> > It's not glib, but your kernel.
> > 
> > If you need to open more files in a single process, change this number
> > and recompile the kernel.
> 
> No need for that! Speaking of the Linux kernel, OPEN_MAX is a legacy
> value without meaning any more. In Linux <= 2.2.x kernel series there
> existed a hardcoded limit of 1024 (default value) file descriptors
> indeed, but starting with kernel 2.4.x the number of file descriptors
> has become dynamic. The initial value appears to be __FD_SETSIZE,
> defined in include/linux/posix_types.h, which defaults to 1024 FDs per
> process. When a process requests to open more files (connections) than
> this, the kernel dynamically expands the file descriptor pool of the
> process up to NR_OPEN files (include/linux/fs.h), which is about 1
> million in my kernel. Since I can confirm polling of more than 1024 open
> files (TCP connections) is possible on Linux, scopes of <200 must be a
> limitation or bug in glib or somewhere else in Userland.
> 
> However, is it possible that you're just suffering from some lower
> ulimit settings (command 'ulimit'), which may be limiting the resources
> available to your program?

$ ulimit -a
core file size (blocks)     1000000
data seg size (kbytes)      unlimited
file size (blocks)          unlimited
max locked memory (kbytes)  unlimited
max memory size (kbytes)    unlimited
open files                  1024
pipe size (512 bytes)       8
stack size (kbytes)         8192
cpu time (seconds)          unlimited
max user processes          14336
virtual memory (kbytes)     unlimited

$ uname -sr
Linux 2.4.2-2

getrlimit(RLIMIT_NOFILES, ...) reports 1024 for both the current
and the max value. Also using setrlimit() doesn't solve the problem.

I've tried another application which also uses poll() (and no glib),
and it can process an array containing more than 256 entries.

But this little test program also fails here with more than 256 entries:
-----------------------
#include <stdio.h>
#include <stdlib.h>
#include <sys/poll.h>

static struct pollfd* create_fds(int num) {
  struct pollfd* poll = NULL;
  int i1;
  
  poll = malloc(sizeof(struct pollfd) * num);
  for (i1 = 0; i1 < num; i1++) {
    poll[i1].fd = 0;
    poll[i1].events |= POLLIN;
    poll[i1].revents = 0;
  }
  return poll;
}

int main(int argc, char** argv) {
  struct pollfd* polls = NULL;
  int num, res;

  if (argc != 2) {
    printf("*** one integer argument required ***\n");
    return -1;
  }
  num = atoi(argv[1]);

  polls = create_fds(num);
  res = poll(polls, num, 5000);
  printf("poll() returned %d\n", res);
  free(polls);

  return 0;
}
-----------------------


Markus.




_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to