2013-08-10 1 views
4

Будучи суперпользователя, я выполнил следующую команду LinuxИсполняемые Стирание Сам по Linux

rm rm 

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

Я пробовал то же самое с chown 0000 chown.

cp -r Dir1/ Dir2/ 

В вышеприведенной команде также, что происходит, когда я удаляю исходный каталог только при копировании?

ответ

2

Это то же, что и для временных файлов.

Напомним, что обычный способ создания временного файла - open(2) файл (сохраняющий его файловый дескриптор), затем unlink(2) (при этом все еще имеется открытый файловый дескриптор). Затем данные файла остаются в файловой системе до тех пор, пока выполняется процесс, и не имеют close(2) -d этого файлового дескриптора.

Это потому, что файлы действительно inodes -не имена файлов в каталогах. (каталоги содержат записи, связывающие имена с inode).

Ядро управляет набором «б» (или «открыто») дескрипторы, и этот набор содержит дескрипторы, выполняемые процессы (собственно, дескрипторы, участвующие в некотором отображении адресов, как через mmap(2) или execve(2))

Поэтому сразу после запуска /bin/rm /bin/rm ядро ​​имеет одну ссылку на rm двоичный файл как исполняемый файл процесса.

Когда он обрабатывает системный вызов unlink, он имеет временные две ссылки (один из которых является процессом в процессе выполнения, другой путь /bin/rm передан в реализацию ядра unlink) и уменьшает его до одного.

Конечно, вам следует избегать ввода /bin/rm /bin/rm, но тогда у вас обычно есть отдельная оболочка, например, sash, чтобы иметь возможность исправить вашу систему.

1

В Windows «rm rm», вероятно, невозможно, из-за упомянутого вами ссылочного счета. Однако в большинстве систем * nix это так. «rm», а также «chmod» загружается в память и только затем будет выполнять все, что указано в командной строке. Другой пример: отредактируйте файл в одном окне и, редактируя этот файл, удалите его в другом окне. Это тоже должно быть возможно на большинстве систем * nix, независимо от количества ссылок.

0

Вы не можете удалить каталог с использованием rm до его пустого.

Смежные вопросы