Как я могу представить символьные ссылки файловой системы в хеше Perl?

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

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

Но затем у меня могло бы быть что-то как:

ls -l
total 0
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 a -> b
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 b -> c
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:03 c -> a
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:17 trap -> b
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:17 x -> y
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:17 y -> b

где это очевидно это a->b->c цикл и то прерывание точки в цикл, но знать x точки в цикл я должен следовать немного.

Одно представление хеша:

a => b
b => c
c => a
trap => b
x => y
y => b

Но обратное представление лучше для маркировки циклов к плохим начальным точкам, после того как я знаю, каковы циклы.

Таким образом, вот некоторые вопросы:

  • Действительно ли хеш является лучшей структурой для представления символьных ссылок?
  • что лучший способ состоит в том, чтобы разделить график файловой системы для сообщения сдвинутых компонентов от древовидных компонентов до ветки с типом цикла части?
  • Существует ли лучший алгоритм, чем ручной поиск всех циклов от всех начальных точек?
  • С точки зрения теории графов - уже этот вид вещи в CPAN? В противном случае, каковы некоторые хорошие модули помощника?

8
задан Community 13 April 2017 в 12:13
поделиться

3 ответа

На CPAN есть модуль Graph, который вы можете использовать, как в следующем:

#! /usr/bin/perl

use warnings;
use strict;

use Graph;

my $g = Graph->new;
my $dir = @ARGV ? shift : ".";

opendir my $dh, $dir or die "$0: opendir $dir: $!";
while (defined(my $name = readdir $dh)) {
  my $path = $dir . "/" . $name;

  if (-l $path) {
    my $dest = readlink $path;
    die "$0: readlink $path: $!" unless defined $dest;

    $g->add_edge($name => $dest);
  }
  else {
    $g->add_vertex($name);
  }
}

my @cycle = $g->find_a_cycle;
if (@cycle) {
  $" = ' -> '; #" # highlighting error
  print "$0: $dir: at least one cycle: @cycle\n";
}
else {
  print "$0: $dir: no cycles\n";
}

Например, в каталоге, похожем по структуре на каталог в вашем вопросе, вывод будет

$ ../has-cycle 
../has-cycle: .: at least one cycle: c -> a -> b
7
ответ дан 5 December 2019 в 20:15
поделиться

Вам нужно сохранить не только имя ссылки. Либо возьмите номер inode (если ваша FS поддерживает это), либо какой-нибудь другой уникальный аспект. Если таковой не существует, подумайте о создании своего собственного, возможно, путем подсчета контрольной суммы имени / даты создания / последнего изменения. В любом случае вам нужен способ однозначно идентифицировать каждую ссылку. Я видел некоторые утилиты, которые просто устанавливают ограничение на количество ссылок (от 8 до 255) и объявляют все, что превышает это ограничение, циклом, но я всегда считал это «дешевым выходом». :)

-1
ответ дан 5 December 2019 в 20:15
поделиться

Быть неидиоматический означает, что вы заставляете читателя тратить время на размышления о том, означает ли то, что они читают, то, что они думают, это значит.

Таким образом, разборчивость не очень покупает сложный (а именно, подозрительный) читатель. Это поражает меня как случай быть умного ради быть умного.

Есть ли какие-либо причины не использовать здесь коммутатор или другую конструкцию?

-121--1293172-

Процесс является контейнером для набора ресурсов, используемых при выполнении программы.

Процесс включает в себя следующее:

  • Частный виртуальный адрес космоса
  • Программа.
  • Список дескрипторов.
  • Маркер доступа.
  • Уникальный идентификатор процесса.
  • По крайней мере один поток.
  • Указатель на родительский процесс, независимо от того, существует он или нет.

При этом процесс может содержать несколько потоков.

Сами процессы могут быть сгруппированы в задания, которые являются контейнерами для процессов и выполняются как отдельные единицы.

Поток - это то, что используется окнами для планирования выполнения команд на CPU. Каждый процесс имеет по крайней мере один.

У меня есть пара страниц на моей вики-странице, где можно просмотреть:

Процесс

Поток

-121--1039970-

Посмотрите на модуль CPAN Файл:: Спецификация:: Ссылка . Метод разрешения говорит, что он пересекает ссылку повторно, чтобы найти связанный конечный объект.

Метод разрешения модуля имеет следующее значение:

resolve ($ ссылка)
Возвращает не-нессылка, в конечном счете связанную с $ ссылка, путем многократного вызова связанной. Возвращает undef, если связь не может быть разрешена

Я использовал этот модуль, чтобы найти цель символической связи, цель которой, в свою очередь, была symlink и так далее. Но я не уверен, обнаружит ли это циклические символические связи.

2
ответ дан 5 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

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