M
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)
http://groups.google.de/groups?hl=de&lr=&threadm=fa.j45o5cv.g2vru%40ifi.uio.no&rnum=6&prev=/groups%3Fq%3Dpoll%2Brlimit%26hl%3Dde%26lr%3D%26selm%3Dfa.j45o5cv.g2vru%40ifi.uio.no%26rnum%3D6
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 argument
Selbiges 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