LINUX.ORG.RU

Определение кол-ва дескрипторов.


0

0

Суть такая:
Пишу сервер.Многопоточный. Принимает коннекты.
Задача стоит в том, чтобы при достижении определенного кол-ва открытых
 сокетов, новые коннекты не принимать.(коннекты иногда раскидываются 
по разным потокам)
Я ,в принципе, могу опросить каждый тред на кол-во используемых им сокетов, то это долго, мрачно и лишний повод для глюков.

Можно ли как-то спросить у системы сколько дескрипторов использует
программа?
★★☆

Заглянуть в /proc/self/fd?

Хотя, непереносимо.

anonymous
()

А что мешает сделать счётчик и увеличивать/уменьшать его при открытии/закрытии дескрипторов?

Deleted
()

можно попробовать парсить /proc/net/udp или /proc/net/tcp

cavia_porcellus ★★★★
()
Ответ на: комментарий от Deleted

Дело в том что close(fd); не закрывает дескриптор
сразу. А тогда когда ядро сочтёт нужным или удобным.

В конце-концов аодобный счетчик -- лишние проблемы.
Информацию желательно получать объективную и из первых рук.
И то и другое суть ядро.

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

> Дело в том что close(fd); не закрывает дескриптор
сразу. А тогда когда ядро сочтёт нужным или удобным.

Код ядра свидетельствует о противоположном:

sys_close():

struct file * filp;
struct files_struct *files = current->files;
struct fdtable *fdt;
int retval;

spin_lock(&files->file_lock);
fdt = files_fdtable(files);
if (fd >= fdt->max_fds)
goto out_unlock;
filp = fdt->fd[fd];
if (!filp)
goto out_unlock;
rcu_assign_pointer(fdt->fd[fd], NULL);
FD_CLR(fd, fdt->close_on_exec);
__put_unused_fd(files, fd);
...

__put_unused_fd():

struct fdtable *fdt = files_fdtable(files);
__FD_CLR(fd, fdt->open_fds);
^^^^^^^^^^^^^^^^^^^

anonymous
()


Хммм... ну по-нормальному надо вести свой счетчик именно тех дескрипторов/сокетов, которые надо ограничивать.
Сделал accept() - увеличил, сделал close() - уменьшил.

Грубый метод - установить setrlimit() на RLIMIT_NOFILE (и отлавливать
EMFILE если надо).

HTH

Onanim
()
Ответ на: комментарий от Stahl

> Дело в том что close(fd); не закрывает дескриптор > сразу. А тогда когда ядро сочтёт нужным или удобным. >

Феерично... сам придумал?

Onanim
()
Ответ на: комментарий от Onanim

>Феерично... сам придумал?

Не сам... послушал "знающих" людей и поверил без проверки. Вероятно действительно прийдется клепать счетчик.

Stahl ★★☆
() автор топика
Ответ на: комментарий от koTuk

стивенс говорит , что надо завести глобальный массив дескрипторов типа:

fd_set	allset;
int client[FD_SETSIZE];
int listenfd = Socket(AF_INET, SOCK_STREAM, 0);
Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
Listen(listenfd, LISTENQ);
for (i = 0; i < FD_SETSIZE; i++)client[i] = -1;
FD_ZERO(&allset);
FD_SET(listenfd, &allset);
for ( ; ; ) 
{
   int nready = Select(listenfd+1, &rset, NULL, NULL, NULL);
...
}

Смысл в том , что nready - это дескриптор очередного присоединенного сокета.
Пихай его в массив client



 





kto_tama ★★★★★
()
Ответ на: комментарий от kto_tama

2kto_tama:
> стивенс говорит , что надо завести глобальный массив дескрипторов типа:

Хммм... и как этот пример связан с исходной задачей?

Onanim
()
Ответ на: комментарий от Onanim

> Я ,в принципе, могу опросить каждый тред на кол-во используемых им сокетов, то это долго, мрачно и лишний повод для глюков.

надо сделать ограничение для каждого треда или для всего сервера?

> надо вести свой счетчик именно тех дескрипторов/сокетов, которые надо ограничивать.

> Сделал accept() - увеличил, сделал close() - уменьшил.


а чем такой вариант не устраивает? И в чем тут могут быть глюки?

samson ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.