nftw отличается от BSD?

Я пытаюсь получить все файлы .c в дереве каталогов, используя nftw со следующим кодом:

static int gf(const char *path, const struct stat *st, int t, struct FTW *ftw) {
    if (t != FTW_F)
        return 0;
    if (strcmp(ext(path), ".c") == 0)
        addl(&files, dup(abspath(path)));
    return 0;
}

void getfiles(char *path) {
    nftw(path, gf, 255, FTW_PHYS);
}

Он работает в Linux и Solaris, но в PC-BSD он просто не подхватывает файлы. Что мне не хватает?


person rwallace    schedule 11.11.2011    source источник
comment
Вы действительно использовали имя dup для strdup? Это похоже на катастрофу, ожидающую случиться! Копирует ли dup2 две строки?   -  person William Pursell    schedule 11.11.2011
comment
Я занимаюсь собственным управлением памятью для строк; dup — это функция, которая в основном выполняет ту же работу, что и strdup, за исключением того, что без накладных расходов, связанных с общим менеджером памяти. Но даже если бы в этой функции была ошибка, она не учитывала бы наблюдаемое поведение, потому что тест, который я запускаю, в основном только проверяет, был ли когда-либо вызван addl.   -  person rwallace    schedule 11.11.2011
comment
Но dup — ужасное имя, так как это стандартная библиотечная функция, дублирующая дескриптор файла.   -  person William Pursell    schedule 11.11.2011
comment
Чтобы уточнить, если nftw пытается дублировать дескриптор файла и вызывает ваш дубликат вместо обычного дублирования, это, скорее всего, завершится ошибкой и вызовет проблемы. (Я не думаю, что это проблема, но это определенно потенциальный источник будущих проблем.)   -  person William Pursell    schedule 11.11.2011
comment
Дох! Я совсем забыл об этой функции. Вы правы, конечно, я изменю имя.   -  person rwallace    schedule 11.11.2011
comment
Функции addl(), abspath() и ext() тоже принадлежат вам (как и dup())? Какой тип files? Вы тестировали их самостоятельно? Удалось ли вам заставить его работать, когда вы изменили имя своей функции dup()?   -  person Jonathan Leffler    schedule 14.11.2011


Ответы (1)


Каково возвращаемое значение nftw? Если это -1, а errno is установлено на EINVAL, весьма вероятно, что вы превышаете значение OPEN_MAX. Попробуйте передать меньшее значение в качестве третьего параметра для nftw и убедитесь, что оно меньше OPEN_MAX.

person chill    schedule 13.11.2011