2013-05-18 3 views
5

Я пишу сервер, который должен обрабатывать много открытых сокетов, поэтому я использую setrlimit() установить максимальное количество дескрипторов открытых файлов (как корень, перед удалением привилегий), так как:Можно ли ожидать, что в Linux, fd <максимальное количество дескрипторов открытых файлов?

#include <sys/resource.h> 
#define MAX_FD_C 9001 

if (setrlimit(
     RLIMIT_NOFILE, &(struct rlimit){.rlim_cur = MAX_FD_C, .rlim_max = MAX_FD_C} 
    ) == -1) { 
    perror("Failed to set the maximum number of open file descriptors"); 
    return EXIT_FAILURE; 
} 

Теперь я осознать, что, вероятно, не будет никаких гарантий и что я нахожусь во власти любого метода, используемого ядром Linux для реализации таблиц дескрипторов файлов; но на практике разумно ли предположить, что любая fd, полученная этой программой от ядра Linux, будет иметь значение меньше MAX_FD_C, которое я установил выше?

Я хотел бы сохранить данные в сокете настолько компактными, насколько это возможно, что может означать просто использование массива типа static struct client clients[MAX_FD_C] = {{0}}; и использование fd в качестве индекса для клиентской структуры (которая будет в основном моей версией FDT).

+1

Да, дескрипторы файлов будут находиться в диапазоне 0 <= fd

+0

Не предполагайте ничего при программировании. Это заставляет вас жить дольше. Шутки в сторону. –

+0

@ RandyHoward: Я думаю, что предположения необходимы, чтобы поддерживать нас здоровыми и эффективными. –

ответ

3

В стандарте POSIX есть функции, которые предполагают это уже. Посмотрите на FD_SETSIZE, select(), FD_SET.

+0

Спасибо, это обнадеживает. Можете ли вы указать, какой раздел (ы) соответствующей документации делает это наиболее очевидным/явным? Я ищу его сейчас, но я не совсем уверен ... – Will

+0

Я предполагаю, что это происходит на странице 'select' man:' Fd_set - это буфер фиксированного размера. Выполнение FD_CLR() или FD_SET() со значением fd, отрицательным или равным или большим, чем FD_SETSIZE, приведет к неопределенному поведению. Более того, POSIX требует, чтобы fd был допустимым файловым дескриптором. – Will

+0

@Will: Обратите внимание, что это не гарантирует, что вы никогда не сможете получить файловый дескриптор над 'FD_SETSIZE', но' open' гарантирует, что результирующий файловый дескриптор - это «небольшое целое», а другие вещи ломаются, t маленький. Если вам нравится, вы также можете использовать 'dup2' для перемещения вне диапазона диапазонов в диапазон (выберите незанятую запись, очевидно). –

 Смежные вопросы

  • Нет связанных вопросов^_^