В Linux (и других UNIX) проводится различие между именем файла ( ссылка ), самим файлом (часто идентифицируемым с помощью inode ) и открытыми дескрипторами файла. Когда вы идете, чтобы удалить файл, вы вызываете unlink()
вызов - это стирает ссылку на файл (вы также можете использовать, rename()
чтобы перезаписать его другим индексом). Однако, если остаются открытые дескрипторы файла (или другие ссылки - файлы могут иметь несколько жестких ссылок ), индекс остается, как и содержимое файла, до тех пор, пока все ссылки и дескрипторы не исчезнут.
Таким образом, запуск программ с использованием библиотеки или чего-либо другого сохраняет дескриптор старой версии (часто неявно через отображение памяти), поэтому он остается на диске. У него просто больше нет имени файла, и он будет очищен, когда все программы, использующие его, будут закрыты (или при следующей перезагрузке, во время проверки файловой системы или воспроизведения журнала).
Кроме того, обратите внимание, что программы, ожидающие «старую библиотеку», будут отлично работать с более новыми версиями библиотеки. Для библиотек Linux назначается имя файла («soname»), которое отражает версию ABI (двоичный интерфейс приложения), предлагаемую библиотекой. Например, библиотека C в моей системе есть libc.so.6
. Любая программа, скомпилированная для более старой версии libc, но все еще версия libc, реализующая ABI версии 6, будет работать с ней хорошо. Действительно старые программы будут искать libc.so.5
или libc.so.4
или что-то вместо этого; в этом случае вам также необходимо сохранить старую версию - но поскольку имя файла другое, это не проблема.