Предотвращение-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. |