Технические вопросы и ответы QA1292

Предотвращение-42 ошибок с DiscRecording

Q: При записи виртуальной файловой системы DiscRecording повторно настраивает-42 ошибки, отображающиеся на tmfoErr (слишком много открытых файлов). Как делают меня обходное решение это?

A: По историческим причинам BSD Mac OS X 10.2.x ограничивает Вас только 256 открытыми дескрипторами файлов. Файлы, используемые DiscRecording, могут использовать два дескриптора каждый; один для ветви данных и один для ветви ресурсов; если Вы не осторожны, таким образом, можно поразить предел довольно быстро.

Хорошие новости - то, что этот предел является только мягким пределом. У Вас может фактически быть столько открытых файлов, сколько Вы хотите. Для разрешения этого необходимо явно вызвать setrlimit (2):

  Код перечисления 1, показывающий, как увеличить открытый предел файла.

#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
 
int main (int argc, const char * argv[])
{
    struct rlimit limit;
    int err;
 
    err = getrlimit(RLIMIT_NOFILE, &limit);
    if (err == 0) {
        limit.rlim_cur = RLIM_INFINITY;
        (void) setrlimit(RLIMIT_NOFILE, &limit);
    }
 
    return 0;
}

Когда мягкий предел устанавливается к RLIM_INFINITY, ограничение для Вашего процесса снято, однако, существует также базовый предел, о котором Вы не можете сделать многого, который является числом vnodes, доступного в ядре.

Каждый открытый дескриптор файла во всей системе приводит один vnode в рабочее состояние, и существует ограниченное количество доступного vnodes. Точное число определяется автоматически на основе того, насколько RAM находится в системе; можно узнать то, что предел путем ввода «sysctl kern.maxvnodes» в Терминале. Типичные значения располагаются где угодно от 4 500 до 35 000.

Если необходимо создать больше чем несколько тысяч файлов, можно все еще сделать так в Mac OS X 10.2.x; просто создайте виртуальный DRFiles вместо реального DRFiles и укажите своего собственного производителя данных. Ваш производитель данных должен открыть файл, когда первый байт отправляется, и закройте его, когда отправляется последний байт.



История версии документа


ДатаПримечания
25.05.2004

Обновленный пример кода. Предыдущий пример кода был недопустим.

18.09.2003

Новый документ, объясняющий как обходному решению-42 ошибки при использовании DiscRecording API.