C: ограничение функции опроса

#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}