Видаляючи файл, ви дійсно видаляєте посилання на файл (до inode). Якщо хтось уже відкрив цей файл, він може зберегти дескриптор файлу, який у них є. Файл залишається на диску, займаючи місце, і його можна записувати та читати, якщо у вас є доступ до нього.
unlink
Функція визначається за допомогою такої поведінки POSIX:
Коли кількість посилань на файл стає 0 і жоден процес не відкриває файл, вільний простір, який займає файл, звільняється, і файл більше не буде доступним. Якщо один або кілька процесів відкривають файл при видаленні останнього посилання, посилання видаляється до повернення unlink (), але видалення вмісту файлу відкладається, поки всі посилання на файл не закриті .
Ця порада через таку поведінку. Демон відкриє файл, і він не помітить, що його видалено (якщо тільки він не контролював його конкретно, що є рідкістю). Він буде пильно писати до наявного дескриптора файлів, який він має: ви будете займати (більше) місця на диску, але ви не зможете побачити жодне з повідомлень, які він пише, тож ви справді в гіршому обох світів. Якщо замість цього файлу обрізати нуль, тоді простір буде звільнено негайно, а будь-які нові повідомлення будуть додані в новому кінці файлу, де ви зможете їх побачити.
Врешті-решт, коли демон припинить або close
s файл , простір буде звільнено. Ніхто новий не може відкрити файл в середній час (окрім через специфічні для системи світловідбиваючі інтерфейси, як Linux/proc/x/fd/...
). Також гарантується, що:
Якщо кількість посилань на файл дорівнює 0, коли всі дескриптори файлів, пов'язані з файлом, закриті, простір, який займає файл, буде звільнений і файл більше не буде доступним.
Таким чином, ви не втрачаєте місця на диску назавжди, але нічого не отримуєте, видаляючи файл, і втрачаєте доступ до нових повідомлень.
/proc/x/fd/y
? Чи це може призвести до того, що процес не зможе записати у дескриптор файлу, чи це незаконна операція?