Czy istnieje sposób na open()
plik i spowodować jego zmniejszenie? Oczywiście można je otwierać w trybie dołączania lub szukać do końca i pisać, aby spowodować ich wzrost. Jednak, o ile mi wiadomo, nie ma metody zmniejszania pliku za pomocą typowych interfejsów wywołań systemowych w stylu uniksowym.
O ile mi wiadomo, jedynym sposobem na zrobienie tego jest sfałszowanie go przez utworzenie nowego krótszego pliku i zastąpienie go rename()
starszym.
Chciałem tylko potwierdzenia, ponieważ zobaczyłem odpowiedź, która sugerowała, że można było utworzyć edytory plików, które działały bezpośrednio na pliku, zamiast przechodzić proces tworzenia nowego i zmiany jego nazwy.
Zawsze myślałem, że interfejs plików w interfejsach wywołań systemowych w stylu libc i unix nie pozwala na zmniejszanie plików w celu ułatwienia implementacji systemów plików i może uniknąć wzorców użytkowania, które mogłyby przyczynić się do fragmentacji.
open()
a openat()
już masz flagę do obcinania, O_TRUNC
więc technicznie powoduje to, że plik się zmniejsza - to znaczy całkowicie się zmniejsza - bez zmiany i-węzła. Najbardziej znanym przykładem jest to command > file.txt
, że plik zostanie obcięty, jeśli istnieje. Po uruchomieniu strace
na bash -c 'true > /dev/null'
zobaczysz openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)
na wyjściu. Oczywiście dla zmiennej wielkości obcięcia potrzebujesz truncate()
syscall. Daj mi znać, jeśli chcesz to jako rzeczywistą odpowiedź zamiast komentarza.
fopen
w trybie „w” (lub „w +”) spowoduje automatyczne obcięcie go do zera. A może masz na myśli zmniejszenie się do zera, aby zachować część starej zawartości?