Linux (та інші UNIX) розмежовують назву файлу ( посилання ), сам файл (часто ототожнюється з inode ) та відкриті ручки до файлу. Коли ви збираєтесь видалити файл, ви викликаєте unlink()
виклик - це стирає посилання на файл (ви також можете використовувати його rename()
для перезапису з іншим inode). Однак якщо відкриті ручки до файлу (або інші посилання - файли можуть мати декілька жорстких посилань ) залишаються, то вклад залишається, і так зберігається вміст файлу, поки всі посилання та ручки не зникнуть.
Тож запущені програми, що використовують бібліотеку або будь-яку іншу інформацію, зберігають стару версію (часто неявно через картування пам'яті), тому вона залишається на диску. Він просто не має імені файлу, і він буде очищений, коли всі програми, що використовують його, вимикаються (або при наступному перезавантаженні, під час перевірки файлової системи або перезапису журналу).
Крім того, зауважте, що програми, які очікують на "стару бібліотеку", стануть чудовими при нових версіях бібліотеки. Бібліотекам Linux присвоюється ім'я файлу ('soname'), яке відображає версію ABI (бінарного інтерфейсу програми), яку пропонує бібліотека. Наприклад, бібліотека С у моїй системі є libc.so.6
. Будь-яка програма, складена зі старшої версії libc, але все ще версія libc, що реалізує версію 6 ABI, буде добре працювати з нею. Дійсно старі програми будуть шукати libc.so.5
або libc.so.4
або що - то замість; в цьому випадку вам також потрібно буде зберегти стару версію, але оскільки ім'я файлу інше, це не проблема.