#c #function #limits
#c #функция #ограничения
Вопрос:
Когда я использую функцию опроса и устанавливаю количество выше 1000, оно вообще не переходит в режим ожидания. Любые идеи о том, что это может быть. opengroup ничего не говорит об ограничении, и я далеко не исчерпываю свое пространство памяти. Но когда я проверяю указатель, целое число оказывается отрицательным. Есть идеи о том, что это может быть?
Комментарии:
1. Из чего было возвращено значение
poll
? Если оно равнялось -1, каково было значениеerrno
?2. ошибка («опрос»); = опрос: недопустимый аргумент
3. Искал, какую функцию использовать из errno.h, но я не мог понять это.
Ответ №1:
Я предполагаю, что ваш лимит для файловых дескрипторов установлен на 1024. Вы можете убедиться в этом, запустив ulimit -n
в bash (unix). Для Windows см. http://support.microsoft.com/kb/111855 . Если вы используете Linux, вы можете увеличить это ограничение, изменив /etc/limits.conf (или /etc/security /limits.conf или аналогичный) следующим образом:
* soft nofile 10240
* hard nofile 10240
Обратите внимание, что после изменения ограничений вам нужно будет выйти из системы и снова войти в нее, чтобы получить новые значения.
Комментарии:
1. Я задавался вопросом о пределе все время, пока я делал это. Теперь существует ли максимальное значение для этого числа? В силу каких зависимостей оно было установлено таким низким по умолчанию?
2. @Jay, максимальное значение, которое вы можете установить для
nofile
rlimits, регулируется с помощью/proc/sys/fs/file-max
; смотритеproc(5)
запись.3. Максимальное значение можно получить многими различными способами. getdtablesize() и getrlimit() с RLIMIT_NOFILE … 1024 открытых fds — это много для типичного приложения. Что касается серверов, вы обычно знаете, что делаете, и увеличиваете это значение до того, которое соответствует вашим потребностям.
4. Странно то, что я не вижу уже установленного правила, как будто оно просто по умолчанию равно 1024 без необходимости в этом.
Ответ №2:
Если poll()
возвращает отрицательное число, вы должны использовать perror("poll");
, чтобы показать причину.
Если причиной является «Недопустимый аргумент», это может быть по этой причине (из справочной страницы poll()
Linux):
EINVAL
Значение nfds превышает
RLIMIT_NOFILE
значение.
Кстати, в спецификации POSIX это тоже указано как ошибка:
Функция poll () завершится ошибкой, если: …
[EINVAL]
nfds
Аргумент больше, чем{OPEN_MAX}