Apakah ada cara untuk open()
file dan menyebabkannya menyusut? Seseorang dapat, tentu saja, membukanya dalam mode-append atau mencari sampai akhir dan menulis untuk menyebabkan mereka tumbuh. Namun, sejauh yang saya tahu, tidak ada metode untuk mengecilkan file melalui antarmuka panggilan sistem khas-unix.
Satu-satunya cara untuk melakukannya, sejauh yang saya tahu, adalah dengan memalsukannya dengan membuat file baru yang lebih pendek dan rename()
menggantikan yang lebih lama.
Saya hanya ingin konfirmasi, karena saya melihat jawaban yang menyiratkan bahwa mungkin membuat editor file yang bekerja secara langsung pada file alih-alih melalui proses pembuatan yang baru dan mengganti nama di tempat.
Saya selalu berpikir bahwa file api di libc dan antarmuka sistem panggilan unix-style tidak memungkinkan penyusutan file untuk memudahkan implementasi sistem file dan mungkin menghindari pola penggunaan yang mungkin berkontribusi terhadap fragmentasi.
sumber
fopen
mode "w" (atau "w +") akan memotongnya menjadi nol panjang secara otomatis. Atau maksud Anda menyusut ke ukuran non-nol, untuk mempertahankan beberapa konten lama?open()
danopenat()
sudah memiliki flag untuk memotong,O_TRUNC
jadi secara teknis itu menyebabkan file menyusut - yaitu menyusut sepenuhnya - tanpa mengubah inode. Contoh paling terkenal dari itu adalahcommand > file.txt
, di mana file akan terpotong jika ada. Jika Anda menjalankanstrace
padabash -c 'true > /dev/null'
Anda akan melihatopenat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)
di output. Tentu saja untuk ukuran pemotongan yang bervariasi, Anda perlutruncate()
syscall. Beri tahu saya jika Anda menginginkan ini sebagai jawaban aktual dan bukan komentar.Jawaban:
man -s 2 ftruncate
kata...
selanjutnya dikatakan bahwa jika Anda menggunakan ftruncate Anda harus membuka file untuk ditulis, dan jika Anda menggunakan truncate file tersebut harus dapat ditulis.
sumber
truncate
- tama mengakomodasi untuk ukuran file baru, dan kemudianwrite
. Begitutruncate
juga panggilan sistem yang Anda cari.fallocate(FALLOC_FL_COLLAPSE_RANGE)
The
open(2)
system call menerimaO_TRUNC
bendera yang dapat mengurangi ukuran file:Ini sering digunakan ketika program bertujuan untuk menimpa isi file sepenuhnya. Contohnya adalah operator pengalihan file shell Anda seperti pada
command > file
.sumber