Poll und rlimit_nofile
-
Hi zusammen,
habe folgendes Problem:
Habe in einem Programm von mir ein Poll, welches ein Array mit 5000 Elementen überwacht, d.h. nfds ist 5000. Nun meldet mir Poll jedoch immer einen Error 22, der wohl bedeutet, dass rlimit_nofile überschritten wird. Das habe ich nun mit rlimit gesetzt auf 10000. Ich lasse mir vorher extra nochmal ausgeben, auf welchen Wert das nun gesetzt ist und er zeigt mir an, dass nofile auf 10000 steht. Wieso macht Poll dann trotzdem Probleme?
Komischerweise geht das Programm auf manchen Rechnern und auf anderen macht es diese Probleme. Wieso? In beiden Fällen wird es als root gestartet, damit es die nötigen Rechte hat und das Programm bestätigt mir ja, dass der Wert gesetzt ist. Gibt es da noch irgendwas zu beachten? Oder ist Error 22 was anderes?
Gruß
Mike
-
Hi,
kann es sein, dass das ein Kernel Bug ist?
Bin nach langem Suchen auf folgenden Newsgroup-Eintrag gestoßen (auch wenn er schon etwas älter ist)
Hier hat jemand selbiges Problem, mit diesem Programm:
#include <sys/resource.h> #include <asm/poll.h> #include <errno.h> main (void) { struct pollfd pfds [10000]; int pollnum=257, retval; struct rlimit rlim; getrlimit (RLIMIT_NOFILE, &rlim); printf ("Cur %d Max %d\n", rlim.rlim_cur, rlim.rlim_max); rlim.rlim_cur = rlim.rlim_max = 32768; if (setrlimit (RLIMIT_NOFILE, &rlim) != 0) printf ("Error in setting max FDs %s\n", strerror(errno)); getrlimit (RLIMIT_NOFILE, &rlim); printf ("Cur %d Max %d\n", rlim.rlim_cur, rlim.rlim_max); memset (pfds, 0, sizeof(struct pollfd)*10000); for (;;) { retval = poll (pfds, pollnum, 10*1000); if (retval > 0) break; if (retval < 0) { printf ("Poll error %s\n", strerror(errno)); return (-1); } } }
Ausgabe ist:
Cur 1024 Max 1024
Cur 32768 Max 32768
Poll error Invalid argumentSelbiges Problem, wie bei mir.
Hier wird die Schuld auf den Kernel geschoben:
The bogus sanity check is in fs/select.h:
err = -EINVAL;
if (nfds > current->files->max_fds)
goto out;Das System ist ein RedHat mit Kernel 2.4.21-20, wo das Programm Probleme macht. Ob der Fehler dort noch enthalten ist?
Angeblich soll folgende Zeile helfen:
dup2(0, pollnum);
Sie wird nach
memset (pfds, 0, sizeof(struct pollfd)*10000);
ergänzt. Ich weiß zwar, was dup2 laut Manpage macht, aber ich weiß nicht, wieso das helfen soll. Hat jemand eine Idee?
Gruß
Mike