O ile mi wiadomo, do manipulowania plikami istnieje tylko sys_write syscall w Linuksie, który zastępuje zawartość pliku (lub rozszerza go, jeśli na końcu).
Dlaczego nie ma wywołań systemowych do wstawiania lub usuwania treści w plikach w systemie Linux?
Ponieważ wszystkie obecne systemy plików nie wymagają przechowywania pliku w ciągłym bloku pamięci, wydajna implementacja powinna być możliwa. (Pliki uległyby fragmentacji.)
W przypadku funkcji systemu plików, takich jak „kopiuj przy zapisie” lub „przezroczysta kompresja plików”, obecny sposób wstawiania zawartości wydaje się bardzo nieefektywny.
files
file-copy
system-calls
dercolamann
źródło
źródło
Odpowiedzi:
W najnowszych systemach Linux jest to faktycznie możliwe, ale z blokiem (przez większość czasu 4096), bez ziarnistości bajtów i tylko w niektórych systemach plików (ext4 i xfs).
Cytowanie ze strony
fallocate(2)
man:źródło
Systemy plików mogą nie wymagać przechowywania plików w ciągłym obszarze (i byłoby to rzeczywiście bardzo mało elastyczne), ale zwykle pliki są przechowywane w blokach o stałej wielkości (lub sekwencjach ciągłych bloków). Wykonanie tego w ten sposób upraszcza implementację, a bloki są zwykle wielokrotnościami wielkości bloku urządzenia bazowego.
Tak więc implementacja wstawek bloków o dowolnej długości spowodowałaby, że format i implementacja systemu plików byłaby bardziej złożona lub wymagałaby przenoszenia potencjalnie dużych ilości danych. Żadne z nich nie jest naprawdę dobre, a złożone struktury danych można budować w przestrzeni użytkownika na interfejsie API systemu plików.
źródło