Портативный эквивалент OPEN_MAX

nftw хочет использовать параметр для количества дескрипторов файлов и, похоже, не может сказать «как можно больше». Указание 255 работает в Linux, но не работает в BSD. По-видимому, OPEN_MAX является рекомендуемым решением для BSD, но я не могу его использовать, так как оно не работает в Linux.

Существует ли портативный эквивалент OPEN_MAX, который будет работать как в Linux, так и в BSD?

В качестве альтернативы, существует ли переносимое число, какое-то число, достаточно большое, чтобы не замедлять работу, переносимое для практических целей (в идеале указанное в POSIX или, по крайней мере, которое будет работать на каждой Unix-подобной системе со значительной долей рынка)?


person rwallace    schedule 22.11.2011    source источник


Ответы (2)


Advanced Programming in the Unix Environment, 2nd Ed дает нам следующий код, который должен работать везде; хотя это довольно умно, я думаю, что немного жаль, что он также не проверяет rlimits процесса, поскольку rlimits может дополнительно ограничивать количество открытых файлов, которые может использовать процесс. Помимо этого, вот код из Мастера:

#ifdef  OPEN_MAX
static long openmax = OPEN_MAX;
#else
static long openmax = 0;
#endif

/*
 * If OPEN_MAX is indeterminate, we're not
 * guaranteed that this is adequate.
 */
#define OPEN_MAX_GUESS  256

long
open_max(void)
{
    if (openmax == 0) {     /* first time through */
        errno = 0;
        if ((openmax = sysconf(_SC_OPEN_MAX)) < 0) {
            if (errno == 0)
                openmax = OPEN_MAX_GUESS;   /* it's indeterminate */
            else
                err_sys("sysconf error for _SC_OPEN_MAX");
        }
    }

    return(openmax);
}

(err_sys() указан в заголовке apue.h вместе с исходными кодами — должно быть легко написать код замены для вашей подпрограммы.)

person sarnold    schedule 22.11.2011

См. getdtablesize. Он имеет примечание о соответствии:

SVr4, 4.4BSD (функция getdtablesize() впервые появилась в 4.2BSD). Это не указано в POSIX.1-2001; переносимые приложения должны использовать sysconf(_SC_OPEN_MAX) вместо этого вызова.

person Artefacto    schedule 22.11.2011
comment
Он даже проверяет rlimits. Хороший. :) - person sarnold; 22.11.2011
comment
IMHO getrlimit() является POSIX-эквивалентом getdtablesize - person wildplasser; 22.11.2011