На Отказе сервера, Как перечислить цепочки символьной ссылки? (не мой вопрос), говорит о списке всех символьных ссылок и после них. Для создания этого выполнимым давайте рассмотрим единственный каталог сначала.
Я хочу записать короткую утилиту, которая делает это. Выглядит легким поместить пар от символьных ссылок в хеш и затем обработать хеш.
Но затем у меня могло бы быть что-то как:
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 есть модуль 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
Вам нужно сохранить не только имя ссылки. Либо возьмите номер inode (если ваша FS поддерживает это), либо какой-нибудь другой уникальный аспект. Если таковой не существует, подумайте о создании своего собственного, возможно, путем подсчета контрольной суммы имени / даты создания / последнего изменения. В любом случае вам нужен способ однозначно идентифицировать каждую ссылку. Я видел некоторые утилиты, которые просто устанавливают ограничение на количество ссылок (от 8 до 255) и объявляют все, что превышает это ограничение, циклом, но я всегда считал это «дешевым выходом». :)
Быть неидиоматический означает, что вы заставляете читателя тратить время на размышления о том, означает ли то, что они читают, то, что они думают, это значит.
Таким образом, разборчивость не очень покупает сложный (а именно, подозрительный) читатель. Это поражает меня как случай быть умного ради быть умного.
Есть ли какие-либо причины не использовать здесь коммутатор или другую конструкцию?
-121--1293172-Процесс является контейнером для набора ресурсов, используемых при выполнении программы.
Процесс включает в себя следующее:
При этом процесс может содержать несколько потоков.
Сами процессы могут быть сгруппированы в задания, которые являются контейнерами для процессов и выполняются как отдельные единицы.
Поток - это то, что используется окнами для планирования выполнения команд на CPU. Каждый процесс имеет по крайней мере один.
У меня есть пара страниц на моей вики-странице, где можно просмотреть:
-121--1039970-Посмотрите на модуль CPAN Файл:: Спецификация:: Ссылка . Метод разрешения говорит, что он пересекает ссылку повторно, чтобы найти связанный конечный объект.
Метод разрешения модуля имеет следующее значение:
resolve ($ ссылка)
Возвращает не-нессылка, в конечном счете связанную с $ ссылка, путем многократного вызова связанной. Возвращает undef, если связь не может быть разрешена
Я использовал этот модуль, чтобы найти цель символической связи, цель которой, в свою очередь, была symlink и так далее. Но я не уверен, обнаружит ли это циклические символические связи.