Почему терминал может удалить себя?

25

Скриншот

Как apt-get remove xtermпроходит? А после удаления xtermне закрывается и продолжает нормально работать.

Является ли xtermкэшировать процесс в оперативной памяти в то время как он работает?

Huey
источник
6
Если быть точным, то это на самом деле не apt-getдеинсталляция xterm, а деинсталляция , и она понятия не имеет, что это каким-то образом зависит от xtermпроцесса, поэтому речь идет о «Почему xterm можно удалить во время работы?». Хороший вопрос
Фолькер Сигел
2
Это похоже на то, как вы можете удалить жесткий диск во время работы ОС.
JKD
выпущено: stackoverflow.com/questions/3356483/…
DarioP

Ответы:

53

Не совсем. Файл уже открыт программой. Удаление файла (а затем его замена другой версией) не влияет на работающую программу, поскольку исходный файл остается открытым (хотя на диске нет имени, чтобы открыть его снова), пока программа не закончит с ним. Только когда все дескрипторы файла закрыты, его блоки данных на диске освобождаются. До этого открытый файл можно читать и записывать, как обычно - единственное изменение - никто другой не может открыть его, так как его имя было удалено.

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

psusi
источник
4
Это фактическая причина .... это также причина, почему rm -rf /работает .....
Heemayl
6
Если вы хотите использовать слово «работает», чтобы описать успешно, все испортило. ;) Интересно, rm -rf /что не получится, если вы попытаетесь запустить его второй раз сразу после этого;)
thomasrutter
1
Я часто видел «/ some / file / name (удалено)» в lsofвыходных данных, и я знаю, что именно так выглядит файл «зомби» ... но есть ли способ сохранить содержимое такого файла от исчезновения когда последний дескриптор файла умирает?
Килиан Фот
1
@KilianFoth, если вы можете найти процесс, у которого все еще открыт файл, то вы можете скопировать его из / proc / $ PID / fd / $ ID в другой файл, но я не могу найти способ восстановить файл на месте, так как все попытки жесткого связывания файла терпят неудачу.
psusi
3
@KilianFoth Если есть дескриптор файла, то, rootвозможно, удастся создать для него имя (и, таким образом, предотвратить удаление) с помощью linkatсистемного вызова. Но исполняемые файлы и библиотеки отображены в памяти, которая не требует дескриптора файла. Я не знаю ни одного способа получить дескриптор файла, который существует только потому, что он отображен в памяти. Хотя к исполняемым /procфайлам можно получить доступ во время их работы, поэтому только библиотеки и другие файлы, отображенные в память, могут быть недоступны для восстановления. Если вы хотите получить более подробную информацию об этом, вы должны задать его в качестве отдельного вопроса.
Касперд
8

Является ли xtermкэшировать процесс в оперативной памяти в то время как он работает?

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

Если это зависит от других файлов (которые не находятся в «открытом» состоянии), которые удалены или заменены, это может вызвать проблемы, но для чего-то более дискретного xterm, чем это, это не проблема.

Оли
источник
6
Не совсем ... части программы считываются в память только при необходимости и могут быть сброшены в любое время, чтобы освободить память для других целей, и поэтому их необходимо будет снова прочитать позже (когда программа пытается получить доступ к этим частям). опять таки ).
Псуси
17
Это не обязательно в оперативной памяти. Но файлы на самом деле не удаляются, пока они не открыты, включая исполняемый файл xterm.
user253751 15.06.15
@immibis, следовательно, мой ответ;)
псуси
2

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

Файл на самом деле работает таким же образом. Чтобы избежать проблем, многие файлы в системах UNIX создают блокировки.

Настоящая загадка заключается в том, почему вы не можете делать такие и подобные вещи в Windows.

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

runlevel0
источник
+1 за "фактическое бездействие - почему вы не можете делать такие и подобные вещи в Windows"
arielf