too many open file descriptors messages since bind
9.4.2-P1 (port dns94)
JINMEI Tatuya / 神明達哉
Jinmei_Tatuya at isc.org
Tue Jul 15 23:37:01 UTC 2008
At Tue, 15 Jul 2008 16:09:17 -0700,
Bakul Shah <bakul at bitblocks.com> wrote:
> IIRC, when poll() returns n, you only look at the first n
> values in the pollfd array so it is a win when you expect a
> very small number of fds to be ready. In the select case you
> have to test the bit array until you see the last ready fd.
% uname -a
FreeBSD opt1.jinmei.org 7.0-RC1 FreeBSD 7.0-RC1 #0: Fri Jan 25 15:17:04 PST 2008 root at opt1.jinmei.org:/usr/src/sys/amd64/compile/GENERIC_NOSMP amd64
(please ignore "RC1":-)
% cat polltest.c
(omitted here, see below)
% cc -o polltest polltest.c
% ./polltest
poll returned: 1
999th socket is ready (fd=1002)
Perhaps You're probably confused poll(2) with /dev/poll. The latter
behaves as you described (but is not portable as poll(2)).
---
JINMEI, Tatuya
Internet Systems Consortium, Inc.
out put of polltest.c
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <poll.h>
main()
{
int i, n;
struct pollfd pfds[1000];
struct sockaddr_in sin;
socklen_t sin_len;
char buf[16];
memset(pfds, 0, sizeof(pfds));
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_len = sizeof(sin);
inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr);
for (i = 0; i < 1000; i ++) {
if ((pfds[i].fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))
< 0) {
perror("socket");
exit(1);
}
if (bind(pfds[i].fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
perror("bind");
exit(1);
}
pfds[i].events = POLLIN;
}
sin_len = sizeof(sin);
if (getsockname(pfds[999].fd, (struct sockaddr *)&sin, &sin_len) < 0) {
perror("getsockname");
exit(1);
}
if (sendto(pfds[999].fd, buf, sizeof(buf), 0, (struct sockaddr *)&sin,
sizeof(sin)) < 0) {
perror("sendto");
exit(1);
}
n = poll(pfds, 1000, -1);
printf("poll returned: %d\n", n);
for (i = 0; i < 1000; i++) {
if ((pfds[i].revents & POLLIN) != 0) {
printf("%dth socket is ready (fd=%d)\n", i, pfds[i].fd);
}
}
exit(0);
}
More information about the freebsd-net
mailing list