Странное поведение readdir(3): поиск несуществующих файлов в /dev/

Я использую opendir / readdir / closedir для воспроизведения программы, аналогичной ls, она работала довольно хорошо, пока я не попытался ls "/ dev /", когда дело доходит до "/ dev / fd /" с рекурсивными опциями, он находит больше файлы, которые на самом деле существуют, это не скрытые файлы (я имею в виду "." начинающие файлы). Истинный ls дает мне: "/dev/fd/:" "0 1 2 3" Мой тоже. Но дело в том, что в GDB он находит еще 3 файла, которые имеют размер 4,5 и 6. Я слышал, что GDB создает свою собственную среду, так что давайте забудем об этом. Когда я пытаюсь выполнить команду ls "/dev/fd/" -R, истинное значение ls немедленно останавливает листинг, в то время как моя программа выдает:

"/ DEV / FD / 3:"

"/ DEV / FD / 3/3 /"

"/Dev/fd/3/3/......../10"

stat return -1 по крайней мере после 40 файлов, но выполнение продолжается: ошибка сегментации.

На моем компьютере "/dev/fd/3/" и т. Д. Являются символическими ссылками, макрос "S_ISDIR" возвращает мне 0 для существующих файлов, но для несуществующих файлов, например: "/ dev / fd / 6 /", он возвращает 1...

Я хотел знать, почему моя программа работает неправильно, в то время как истинная ls не работает, я заметил, что ls использует stat64 на моем компьютере, но когда я это делаю, она все равно работает неправильно... она также использует fstat64, futex и другие системные вызовы, которые я не делаю знать.

Я могу показать вам некоторые примеры моих кодов или подробно рассказать, что мне действительно сложно объяснить, извините за это.

Спасибо вам.

PS: я не получаю этого утверждения на man-странице readdir: "Данные, возвращаемые readdir, могут быть перезаписаны последующими вызовами readdir для того же потока каталога"

1 ответ

PS: я не получаю этого утверждения на man-странице readdir: "Данные, возвращаемые readdir, могут быть перезаписаны последующими вызовами readdir для того же потока каталога"

В основном они говорят, что функция не является входящей, и что указатель возвращается readdir не следует просто кэшировать как уникальное значение, так как базовые данные, на которые указывают, изменятся при следующем вызове readdir функция. По сути, они позволяют реализациям определять статически распределенные данные, которые могут быть переработаны функцией, или динамическую память, управляемую ОС, чтобы вызывающая сторона readdir не нужно беспокоиться об управлении памятью, на которую указывает возвращаемое значение readdir, Например, для примера функции, такой как:

int* my_sample_increment()
{
    static int val = 0;
    val++;

    return &val;
}

если бы вы сделали что-то вроде

int* int_ptr_1 = my_sample_increment();
int* int_ptr_2 = my_sample_increment();

Тогда оба int_ptr_1 а также int_ptr_2 будет указывать на то же значение, и в этом случае это будет значение 1, Каждый указатель не будет указывать на уникальное целочисленное значение.

То же самое относится и к readdir, Вы не можете просто позвонить readdir и сохранить возвращаемый указатель, ожидая использовать его позднее, без указания данных, которые будут изменены при любых последующих вызовах readdir между временем, когда вы сохранили указатель, и временем, когда вы его используете. Если вам нужна такая функциональность, это то, что повторная версия, readdir_r для.

Другие вопросы по тегам