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_TRUNCwię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 stracena 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.
fopenw 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?