Linux: Как делает твердое соединение к работе каталога?

Это означает это без -f, pgrep только поиски обеспеченного regexp на названия команды, в то время как с -f это ищет его в их аргументах (где первый аргумент (argv[0]) не обязательно то же как название команды).

$ sleep 2000 &
[1] 15768
$ pgrep 2000
$ pgrep -f 2000
15768

И если мы вызываем argv[0] отличаться от названия команды (на Linux, как замечено в /proc/$pid/stat) как тогда, когда с помощью zsh ARGV0:

$ ARGV0=foo sleep 2000 &
[2] 15881
$ ps -fp $!
UID        PID  PPID  C STIME TTY          TIME CMD
chazelas 15881 13126  0 19:55 pts/1    00:00:00 foo 2000
$ ps -o comm= $!
sleep
$ awk '{print $2}' /proc/$!/stat
(sleep)
$ pgrep foo
$ pgrep sleep
15881
$ pgrep -f sleep
$ pgrep -f foo
15881

Существует много потенциального беспорядка относительно имени процесса на Unix и Linux. Существует 3 атрибута процесса, который мог утверждать, что был именем процесса:

  • Базовое имя исполняемого файла, который был передан последнему execve (2) системный вызов, который сделал процесс. На Linux, который используется для инициализации имени процесса, как сообщается ps или найденный в /proc/$pid/stat. Однако нужно отметить, что на Linux, это может быть изменено с помощью prctl(PR_SET_NAME...).
  • любой путь к исполняемому файлу, который в настоящее время является mmapредактор для выполнения в процессе и предпочтительно пути, поскольку это было вызвано (для сценариев, которые будут путем, обеспеченным в строке хижины, например). На Linux можно получить его с a readlink или /proc/$pid/exe. Тот, Вы не можете измениться, не называя другого execve (хотя Вы могли в теории загружать новый исполняемый файл в памяти и выполнять ее код без вызова execve, посмотрите, например, некоторые попытки пространства пользователя execve).
  • Первый аргумент провел execve системный вызов. Условно, тот аргумент предназначен, чтобы сказать приложению его имя для уведомления его, как вести себя соответственно так часто, что предназначено именем процесса. На Linux это может быть найдено в /proc/$pid/cmdline, но процесс может также изменить его путем изменения памяти, которой указывают argv[0].

Нужно также отметить, что существует большое изменение среди Нельдов различия.

5
12.01.2014, 03:41
2 ответа

Жесткие ссылки на каталоги не существенно отличаются от жестких ссылок для файлов. На самом деле много файловых систем действительно имеют жесткие ссылки на каталогах, но только очень дисциплинированным способом.

В файловой системе, которая не позволяет пользователям создавать жесткие ссылки на каталоги, ссылки каталога точно

  1. . запись в самом каталоге;
  2. .. записи во всех каталогах, которые имеют этот каталог как их родителя;
  3. одна запись в каталоге это .. точки к.

Дополнительное ограничение в таких файловых системах состоит в том что из любого каталога, после .. узлы должны в конечном счете привести к корню. Это гарантирует, что файловая система представлена как единственное дерево. Это ограничение нарушено в файловых системах, которые позволяют жесткие ссылки на каталоги.

Файловые системы, которые позволяют жесткие ссылки на каталоги, позволяют больше случаев, чем три выше. Однако они поддерживают ограничение, что эти случаи действительно существуют: каталог . всегда существует и указывает на себя; каталог .. всегда точки к каталогу, который имеет его как запись. Удаление связи с записью каталога, которая является каталогом только, удаляет его, если он не содержит записи кроме . и ...

Таким образом свисание .. не может произойти. То, что может пойти не так, как надо, - то, что часть файловой системы может стать отдельной. Если каталог .. указывая на одного из его потомков, так, чтобы ../../../.. в конечном счете формирует цикл. (Как замечено выше, файловые системы, которые не позволяют манипуляции жесткой ссылкой, предотвращают это.), Если все пути от корня до такого каталога являются несвязанными, часть файловой системы, содержащей этот каталог, не может больше достигаться, если нет процессы, которые все еще имеют их текущий каталог на нем. Та часть не может даже быть удалена, так как нет никакого способа достигнуть ее.

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

3
27.01.2020, 20:38
  • 1
    'Специальное' спасибо за упоминание GCFS - я никогда не знал, что это существовало. –  Harry 12.01.2014, 04:36
  • 2
    Разве точка Не 1 и 3 то же всегда? В противном случае, По которым случаям они отличались бы? Точки –  Vishal Sahu 06.12.2015, 20:02
  • 3
    @VishalSahu 1, 2 и 3 являются тем же inode — это - то, что означает быть ссылками на тот же файл. Они - очевидно, все различные записи каталога, так как они все расположены в различных каталогах (1. сам каталог; 2. его дочерние каталоги; 3. его родитель). –  Gilles 'SO- stop being evil' 06.12.2015, 20:04

Твердое соединение каталог (при разрешении) работы почти так же столь же трудно связывающийся простой файл. Так, твердое соединение всегда увеличивает число каналов одним, и таким образом, в Вашем вопросе № 1 число каналов увеличилось бы от 2 до 3.

Вопросом № 2 является немного больше изгиба ума, и он зависит от как умный rmdir . Обычно, если Вы удаляете каталог a/b/c, “rmdir” программа удаляет связь

  • a/b/c/.  - inode 400
  • a/b/c/.. - inode 300
  • a/b/c    - inode 400

Но помните- c и H тот же каталог (inode), таким образом, это могло бы быть более точно для переструктурирования вышеупомянутого списка как

  • (inode 400)/.  - inode 400
  • (inode 400)/.. - inode 300
  • (inode 300)/c  - inode 400

Другими словами, . и .. записи будут удалены из inode 400 (известный как a/b/c и a/h), таким образом, Ваше предположение рассматриваемый № 2 может быть неправильным – каталог H мог бы продолжить существовать, но быть абсолютно пустыми (даже любой . и .. записи).

Но другая возможность состоит в том, что “rmdir” будет видеть что число каналов на c 3 и мог бы удалить связь только a/b/c, а не записи в c (inode 400). В этом случае думайте, как это работает с простыми файлами. (Я предполагаю, что Вы в основном понимаете это.)

  • Если Вы создаете файл antelope, жесткая ссылка это к gazelle, и затем удалите antelope, файл все еще существует под именем gazelle.

  • Если Вы создаете файл dir1/antelope, жесткая ссылка это к dir2/gazelle, и затем удалите dir1/antelope, файл все еще существует под именем dir2/gazelle.

  • Хорошо, замена b для antelope, a для dir1, .. для gazelle, и H для dir2. Затем H/.. (inode 300) продолжил бы существовать с числом каналов 1, но (как в другом сценарии) это будет абсолютно пусто (даже любой . и .. записи).

Этот вид путаницы - то, почему трудно связывающимся каталогам сильно препятствуют.

3
27.01.2020, 20:38
  • 1
    +1 для проявления другой возможности абсолютно пустого dir - без даже . и .. - в некоторой реализации функции. Быть ' препятствовавшимся' для использования функции является одной вещью (как, ей препятствуют для работы как root на *отклоняют поле для обычной работы), но механика функции, дизайна позади нее, является другим. Мой вопрос был больше на дизайне функции и побочных эффектов (если таковые имеются), если это поддерживалось системой и если пользователь был a root пользователь. Например, как учебник описал бы эту функцию, несмотря на протесты, которые будут идти с ним? –  Harry 12.01.2014, 03:24
  • 2
    @Harry Здесь, Вы предполагаете, что файловая система позволяет удалять непустой каталог, который очень отличается от разрешения жестких ссылок на каталоги. Некоторые варианты Unix позволяют жесткие ссылки на каталоги, но они осуществляют это если каталог A .. точки к B затем B содержат запись для A. –  Gilles 'SO- stop being evil' 12.01.2014, 03:38
  • 3
    @Gilles, относительно которого я сомневаюсь, принимал ли я удаление непустых директоров, я мог бы вновь заявить о части удаления как это, если Вам нравится: Во-первых, удалите файл a/b/c/d, затем dir a/b/c, и наконец dir a/b. Так, мой вопрос - мудр дизайном - что должно произойти с процессом, который имел ранее cdредактор самостоятельно в a/H но теперь попытки a cd ..? Не уверенный, если я следовал за Вашим последним предложением: не B всегда содержат запись для A? –  Harry 12.01.2014, 03:48
  • 4
    @Harry, “Не делает B, всегда содержат запись для A?” Нет; в Вашем примере, a/H жесткая ссылка на a/b/c, таким образом, они - тот же inode (#400). И inode 400 содержит записи (., 400), (.., 300), и возможно (d, 500), если Вы еще не удалили его. Так a/H имеет a .. запись, которая указывает на inode 300, который доступен от корня файловой системы как a/b. Но, если Вы удалили a/b/c, затем inode 300 (a/b) больше не содержит запись для inode 400. –  Scott 12.01.2014, 23:05
  • 5
    @Harry Относительно Вашего первого комментария: Я думал, что действительно отвечал на Ваш вопрос на дизайне функции и побочных эффектов (если таковые имеются), если это поддерживалось системой и если пользователь был пользователем root. Спросить, как учебник описал бы жесткие ссылки, немного слишком широко для Exchange Стека, но если существует некоторая особая техническая информация, которую Вы все еще хотите знать, идти вперед и спросить. –  Scott 12.01.2014, 23:09

Теги

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