Переносимый эквивалент OPEN_MAX - PullRequest
2 голосов
/ 22 ноября 2011

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

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

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

Ответы [ 2 ]

4 голосов
/ 22 ноября 2011

Расширенное программирование в среде Unix, 2-е изд. дает нам следующий код, который должен работать везде;хотя это довольно умно, я думаю, что это немного прискорбно, так как также не проверяет ограничения процесса, так как эти ограничения могут дополнительно ограничить количество открытых файлов, которые может использовать процесс.Кроме того, вот код Мастер :

#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 с исходными текстами - должно быть легко заменить кодВаша рутина.)

2 голосов
/ 22 ноября 2011

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

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

...