Что делает “опции, активированные” в GNU, находят средними?

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

8
18.02.2015, 02:54
3 ответа

Решение состоит в обновлении pkg-config до последней версии (на данный момент 0.28). У меня было 0,18.

-121--197992-

Из глоссария в /usr/share/doc/man-db/man-db-manual.txt (источник: manual/glossary.me ):

cat page
Отформатированная страница вручную, предназначенная для просмотра на терминале типа vt100.

страница бродячих кошек
Страница «cat», которая не имеет относительную страницу «manual» в системе, т.е. была предоставлена только страница «cat» или страница «manual» была удалена после была создана страница кошек.
-121--15750-

Информация о O _ NOFOLLOW приведена на странице info find :

9,2,1,1 O_NOFOLLOW

..................

Если система поддерживает флаг O_NOFOLLOW (1) к системе open (2) ' вызов, find 'использует его при безопасном изменении каталога. Цель сначала открывается каталог, а затем find 'changes working directory с системным вызовом fchdir () '. Это гарантирует, что символьные ссылки не соблюдается, предотвращая тип атаки на состояние расы, при котором используется выполнен из символических ссылок.

...

Из исходного дерева CBO появляется только в файле parser.c :

 printf("CBO(level=%d) ", (int)(options.optimisation_level)); 

, указывающем, что это оптимизация на основе затрат (мое лучшее предположение).

D _ TYPE происходит в нескольких местах в исходном дереве и, похоже, связано с типом записи каталога

$ grep 'D_TYPE' */**

Выходы:

find/parser.c:#if defined USE_STRUCT_DIRENT_D_TYPE && defined HAVE_STRUCT_DIRENT_D_TYPE
lib/savedirinfo.c:#if defined HAVE_STRUCT_DIRENT_D_TYPE && defined USE_STRUCT_DIRENT_D_TYPE

и некоторыми другими записями. Источник можно найти здесь .

1
27.01.2020, 20:11

При просмотре дерева исходных текстов findutils (http://git.savannah.gnu.org/cgit/findutils.git/tree/) я нашел следующее:

  • configure.ac: --enable-d_type-optimization,Use of the file type data returned in struct dirent. d_type by readdir()),
  • m4/withfts.m4: --without-fts Используйте более старый механизм поиска файловой системы, вместо того, чтобы использовать fts()

я ничего не нашел про CBO; возможно, вам придется скачать исходные тексты и искать этот термин...

0
27.01.2020, 20:11

Это полный ответ, полученный из ответов Кетана и Дэниела Куллмана, а также из моего собственного исследования.

Большинство "особенностей" оказываются оптимизациями запросов, так как find в целом способен (почти) выполнять произвольно сложные запросы на файловой системе.


D_TYPE

Наличие функции D_TYPE означает, что find было скомпилировано с поддержкой поля d_type в struct dirent. Это поле является расширением BSD, также принятым в Linux, которое предоставляет тип файла (каталог, файл, труба, сокет, устройство char/block и т.д.) в структуре, возвращаемой из readdir и друзей. В качестве оптимизации find может использовать это для уменьшения или устранения вызовов lstat, когда в качестве выражения фильтра используется -тип. В некоторых файловых системах

readdir может не всегда заполнять d_type, поэтому иногда все равно потребуется lstat.

Больше информации из официальной документации: https://www.gnu.org/software/findutils/manual/html_node/find_html/d_005ftype-Optimisation.html

O_NOFOLLOW

This option will read either (enabled) or (disabled). Если присутствует и включено, то эта функция реализует меру безопасности, которая защищает find от определенных атак гонки TOCTTOU. В частности, она предотвращает find от обхода симлинк во время выполнения обхода каталога, который может произойти, если каталог был заменен симлинк после того, как был проверен тип файла каталога, но до того, как каталог был введен.

С включенной опцией, find будет использовать open(..., O_NOFOLLOW) в каталоге, чтобы открыть только реальные каталоги, затем использовать openat, чтобы открыть файлы в этом каталоге.

LEAF_OPTIMISATION

Эта слегка непонятная оптимизация позволяет найти, чтобы вычислить, какие подкаталоги родительского каталога являются каталогами, используя счетчик ссылок родительского каталога, так как подкаталоги будут вносить вклад в счетчик ссылок родительского каталога (через ссылку ... ). В некоторых случаях это позволит найти для элиминации вызова stat. Однако, если файловая система или ОС искажает st_nlinks, это может привести к тому, что найдет и выдаст фальшивые результаты (к счастью, это очень редкое явление).

Более подробная информация в официальной документации: https://www.gnu.org/software/findutils/manual/html_node/find_html/Leaf-Optimisation.html

FTS

Когда включена, функция FTS заставляет найти использовать fts API для перемещения по файловой иерархии, а не прямую рекурсивную реализацию.

Мне неясно, в чем преимущество fts, но FTS, по сути, является стандартной для всех версий по умолчанию find, которые я видел до сих пор.

Больше информации: https://www.gnu.org/software/findutils/manual/html_node/find_html/fts.html, http://man7.org/linux/man-pages/man3/fts.3.html

CBO

Оказывается (после прочтения исходного кода найти, как предложил Даниэль Куллман), что "CBO" относится к уровню оптимизации запросов (это означает "стоимостной оптимизатор"). Например, если я сделаю найду -O9001 --версия, то получу

Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=9001) 

Глядя на опцию -O в man find, я вижу

-Olevel
 Включает оптимизацию запросов. Находящая программа переупорядочивает тесты, чтобы ускорить выполнение, сохраняя при этом общую сумму
 Эффект, то есть предикаты с побочными эффектами не упорядочены относительно друг друга. Проведенные оптимизации
 на каждом уровне оптимизации следующие.

 0 Эквивалент уровня оптимизации 1.

 1 Это уровень оптимизации по умолчанию и соответствует традиционному поведению. Выражения
 перестроен таким образом, что сначала выполняются тесты, основанные только на именах файлов (например, -name и -regex).

 2 Любые тесты -type или -xtype выполняются после любых тестов, основанных только на именах файлов, но перед любыми
 тесты, которые требуют информации от входа. Во многих современных версиях Unix, типы файлов возвращаются по формуле
 readdir() и поэтому эти предикаты быстрее оцениваются, чем предикаты, которые должны сначала выполнить статистику файла.

 3 На этом уровне оптимизации, включен полный оптимизатор запросов на основе стоимости. Изменен порядок тестирования
 чтобы сначала были проведены дешевые (т.е. быстрые) тесты, а потом, если понадобится, более дорогие...
 Сэри. В пределах каждого диапазона затрат предикаты оцениваются раньше или позже в зависимости от того, вероятны ли они.
 преуспеть или нет. Для -o, предикаты, которые, скорее всего, будут успешными, оцениваются ранее, а для -a, преди-...
 кейты, которые, скорее всего, не справятся с задачей, оцениваются ранее.

 Оптимизатор, основанный на стоимости, имеет фиксированное представление о том, какова вероятность успеха любого данного теста. В некоторых случаях вероятность
 учитывает специфику теста (например, предполагается, что тип f имеет больше шансов на успех, чем
 -тип С). В настоящее время оценивается оптимизатор, основанный на стоимости. Если он на самом деле не улучшит производительность
 найденного, он будет снова удален. И наоборот, оптимизация, которая оказывается надежной, прочной и эффективной может быть
 включается при более низких уровнях оптимизации с течением времени. Однако поведение по умолчанию (т.е. уровень оптимизации 1) не будет
 быть измененным в версии 4.3.x. Набор тестов findutils выполняет все тесты, найденные при каждой оптимизации.
 выравнивает и гарантирует, что результат будет одинаковым.

Тайна решена! Немного странно, что опция является значением времени выполнения; обычно я ожидал, что вывод --версия будет отражать только опции времени компиляции.

8
27.01.2020, 20:11

Теги

Похожие вопросы