Ограничения симулятора VXWORKS?

В настоящее время я работаю над портированием кода под VxWorks. поэтому я использую симулятор для проверки изменений. Этот код требует открытия многих каналов и сокетов. У меня проблема с открытием этих файлов дескрипторов. Действительно, я могу открыть дескрипторы 17 файлов (сокеты или каналы вызывают ту же ошибку), но следующие возвращают ошибку «EMFILE: слишком много открытых файлов». После некоторых исследований в сети я изменил глобальную переменную NUM_FILES, но это изменение не имело никакого эффекта. Знаете ли вы, что это симулятор, который ограничивает количество дескрипторов файлов, открываемых одновременно?

Спасибо за помощь


person basile    schedule 06.07.2016    source источник


Ответы (2)


У меня также были проблемы с недостаточным количеством доступных файловых дескрипторов. Установка NUM_FILES на 50 или около того решила проблему. Ограничение связано с ядром VxWorks, которое статически выделяет таблицу файловых дескрипторов.

Насколько я знаю, изменение NUM_FILES требует перекомпиляции ядра, так как это значение конфигурации ядра.

Вы можете подсчитать количество свободных файловых дескрипторов, скомпилировав и выполнив следующую функцию в оболочке VxWorks:

int countFreeFds(void)
{
    int count = 0;
    int i;
    FILE *fd[100];

    for (count = 0; count < 100; count++)
    {
        fd[count] = fopen("somefile", "r");   /* some any existing file */
        if (fd[count] == NULL)
        {
            break;
        }
    }

    for (i = (count - 1); i >= 0; i--)
    {
        fclose(fd[i]);
    }

    return (count);
}

Если вы сделаете это на только что запущенном VxWorks без дополнительных загруженных двоичных файлов или запущенных задач, значение, возвращаемое countFreeFds, будет возвращать число, близкое к NUM_FILES.

(также обратите внимание, что я не тестировал функцию выше, так как прямо сейчас у меня нет доступа к источнику, который я использовал несколько лет назад... вы также можете изменить код для использования вместо этого сокетов или каналов, но относительно бесплатные файловые дескрипторы не имеют значения)

person Lukas Thomsen    schedule 06.07.2016
comment
Да, после изменения значения я перекомпилировал ядро. Я уверен, что значение NUM_FILES было изменено, потому что я печатаю его во время инициализации VxWorks, и оно равно 100, как я изменил его в ядре. - person basile; 07.07.2016
comment
Я работаю в RTP, не знаю, может ли это повлиять на проблему. - person basile; 07.07.2016

я нашел проблему

мне пришлось изменить RTP_FD_NUM_MAX, это было определенное значение RTP

person basile    schedule 11.07.2016