nftw передает tflag с неопределенным значением

Проходя по каталогу, используя nftw, вот так:

nftw((argc < 2) ? "." : argv[1], rm, 20, FTW_DEPTH|FTW_PHYS)

nftw передает значение 5 параметру tflag функции rm, когда встречается с каталогом. Заголовок ftw.h указывает только перечисление с 4 значениями (0-3) для параметра tflag, из которых FTW_D или 1 является подходящим значением для каталога. Значение fpath представляется правильным во всех случаях.

Итак, мой вопрос заключается в следующем. Почему он передает 5, а не 1 для флага, и что 5 означает для флага?

РЕДАКТИРОВАТЬ:

Фактически это было значение FTW_DP (каталог, все подкаталоги были посещены), которое было определено ниже в зависимой от среды части, которую я не заметил.

1 ответ

Решение

Спецификация POSIX nftw() говорит, что флаг аргумент вашего rm функция должна быть одной из:

  • FTW_D Объект является каталогом.
  • FTW_DNR Объект представляет собой каталог, который не может быть прочитан. Функция fn не должна вызываться ни для одного из ее потомков.
  • FTW_DP Объект является каталогом, и подкаталоги были посещены. (Это условие должно возникать только в том случае, если флаг FTW_DEPTH включен в флаги.)
  • FTW_F Объект не является каталогом.
  • FTW_NS Функция stat() не выполнена на объекте из-за отсутствия соответствующих разрешений. Буфер статистики, передаваемый в fn, не определен. Сбой stat() по любой другой причине считается ошибкой, и nftw() возвращает -1.
  • FTW_SL Объект является символической ссылкой. (Это условие должно происходить только в том случае, если в флаги включен флаг FTW_PHYS.)
  • FTW_SLN Объект является символической ссылкой, которая не называет существующий файл. (Это условие должно выполняться только в том случае, если флаг FTW_PHYS не включен в флаги.)

Поскольку вы не идентифицируете свою систему, а стандарт не определяет, какое число должно быть связано с аргументом флага вызываемой функции, никто не может определить, что 5 значит в твоей системе. Тем не менее, есть достаточно вариантов, которые 5 не кажется неправдоподобным как ценность.

В Mac OS X (10.9.5) значение 5 было бы FTW_SL, В другой системе, основанной на OSF, jedwards отмечает в комментарии, что значение 5 для FTW_DP Таким образом, полностью оправдывая мое наблюдение, что флаг, представленный 5 зависит от системы.

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