LINUX.ORG.RU

Лимит файловых дескрипторов


0

0

Позникла следующая проблема: в tcp-серевере, при кол-ве открытых файловых дескрипторов чуть больше 1000 вылетаю в сигфолт. Если быть точным:

New connection on socket 1013
Client Number: 1008

Листинг валгринда:

==14742== Warning: invalid file descriptor 1019 in syscall accept()
==14742==
==14742== Process terminating with default action of signal 11 (SIGSEGV)
==14742== Access not within mapped region at address 0x206
==14742== at 0x407522D: getenv (in /lib/libc-2.8.so)
==14742== by 0x40CE666: (within /lib/libc-2.8.so)
==14742== by 0x40CE9FC: tzset (in /lib/libc-2.8.so)
==14742== by 0x40D4AAF: (within /lib/libc-2.8.so)
==14742== by 0x410CCE6: __vsyslog_chk (in /lib/libc-2.8.so)
==14742== by 0x410D1DA: syslog (in /lib/libc-2.8.so)
==14742== by 0x80492C0: addEpollEvent (listener.c:23)
==14742== by 0x8049661: Listener (listener.c:163)
==14742== by 0x27B: ???

Если я правильно понял то достигаю лимита на дескрипторы,
но как вычислять ошибку? как определить что accept() возвращает левый дескриптор? И как перешагнуть лимит?


Ответ на: комментарий от Sylvia

Ок. Есть вопросы:

Как изменить лимит из приложения?
Почему сигфолт во время привышения? И accept возврашает корявый дескриптор?
Как это отслеживать?

T-34
() автор топика
Ответ на: комментарий от Sylvia

Oooo. Я думаю исчерпывающий ответ :) Big thx.

T-34
() автор топика

Из приложения можно узнать текущий лимит с помощью getrlimit(RLIMIT_NOFILE), но вроде в этом случае должен приходить errno=EMFILE. А в ващем случае, ИМХО, надо искать ошибку, так как "invalid file descriptor 1019 in syscall accept()". Может покажете свой код?

mky ★★★★★
()
Ответ на: комментарий от T-34

> И accept возврашает корявый дескриптор?

Он точно не -1 возвращает?

Legioner ★★★★★
()

Была ещё какая-то потенциальная уязвимость в select-related макросах (связанная с тем, что это реализовано как битовая маска).

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