Чи є спосіб, щоб open()
файл і змусив його скорочуватися? Можна, звичайно, відкривати їх у додатку або шукати до кінця та писати, щоб вони зростали. Однак, наскільки я знаю, немає способу зменшити файл через типові інтерфейси системного виклику в стилі Unix.
Наскільки я знаю, єдиний спосіб зробити це підробкою, створивши новий коротший файл і rename()
замість старого.
Я просто хотів підтвердження, тому що я побачив відповідь, яка передбачала, що можна зробити редактори файлів, які працювали безпосередньо над файлом, а не пройти процес створення нового та перейменування його на місце.
Я завжди вважав, що файл api в інтерфейсах системного виклику в стилі libc і unix не дозволяє скорочувати файли, щоб полегшити реалізацію файлових систем і, можливо, уникати шаблонів використання, які можуть сприяти фрагментації.
open()
і openat()
вже є прапор для обрізання, O_TRUNC
так що технічно це призводить до скорочення файлу, тобто зменшення повністю - без зміни inode. Найвідоміший приклад тому command > file.txt
, де файл буде усічений, якщо він існує. Якщо ви біжите strace
на bash -c 'true > /dev/null'
вас будуть бачити openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)
на виході. Звичайно для змінного розміру усічення вам потрібен truncate()
syscall. Дайте мені знати, чи хочете ви це як фактичну відповідь замість коментаря.
fopen
в режимі "w" (або "w +") автоматично скоротить його до нульової довжини. Або ви маєте на увазі скорочення до ненульового розміру, щоб зберегти частину старого вмісту?