Apakah antarmuka panggilan sistem yang khas memungkinkan pengurangan ukuran file (tanpa menggantinya dengan inode yang berbeda)?

9

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.

JoL
sumber
2
Hanya dengan membuka file dengan fopenmode "w" (atau "w +") akan memotongnya menjadi nol panjang secara otomatis. Atau maksud Anda menyusut ke ukuran non-nol, untuk mempertahankan beberapa konten lama?
Wyzard
4
Hanya FYI, open()dan openat()sudah memiliki flag untuk memotong, O_TRUNCjadi secara teknis itu menyebabkan file menyusut - yaitu menyusut sepenuhnya - tanpa mengubah inode. Contoh paling terkenal dari itu adalah command > file.txt, di mana file akan terpotong jika ada. Jika Anda menjalankan stracepada bash -c 'true > /dev/null'Anda akan melihat openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)di output. Tentu saja untuk ukuran pemotongan yang bervariasi, Anda perlu truncate()syscall. Beri tahu saya jika Anda menginginkan ini sebagai jawaban aktual dan bukan komentar.
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy saya berpikir untuk menyusut ke ukuran yang sewenang-wenang. Saya telah mengangkat jawaban David Foerster karena menjawab sebagian dari pertanyaan itu, tetapi saya tidak menerimanya dengan mempertimbangkan icarus. Saya akan menganggapnya sebagai jawaban tipe ya-dan-tidak, sedangkan jawaban icarus sudah menunjukkan bahwa jawaban sebenarnya adalah "ya".
JoL

Jawaban:

22

man -s 2 ftruncate kata

DESCRIPTION
   The  truncate()  and  ftruncate()  functions cause the regular file
   named by path or referenced by fd to be truncated to a size of precisely
   length bytes.

...

CONFORMING TO
   POSIX.1-2001, POSIX.1-2008, 4.4BSD, SVr4 (these calls first appeared in 4.2BSD).

selanjutnya dikatakan bahwa jika Anda menggunakan ftruncate Anda harus membuka file untuk ditulis, dan jika Anda menggunakan truncate file tersebut harus dapat ditulis.

icarus
sumber
Menambah file menyebabkan OS pertama truncate- tama mengakomodasi untuk ukuran file baru, dan kemudian write . Begitu truncatejuga panggilan sistem yang Anda cari.
mgarciaisaia
1
Di Linux, lihat jugafallocate(FALLOC_FL_COLLAPSE_RANGE)
Stéphane Chazelas
2

The open(2)system call menerima O_TRUNCbendera yang dapat mengurangi ukuran file:

O_TRUNC- Jika file tersebut ada dan merupakan file biasa, dan file tersebut berhasil dibuka O_RDWRatau O_WRONLY, panjangnya akan dipotong menjadi 0, dan mode dan pemiliknya tidak akan berubah. Ini tidak akan berpengaruh pada file khusus FIFO atau file perangkat terminal. Efeknya pada tipe file lain ditentukan oleh implementasi. Hasil penggunaan O_TRUNCtanpa salah satu O_RDWRatau O_WRONLYtidak ditentukan.

Ini sering digunakan ketika program bertujuan untuk menimpa isi file sepenuhnya. Contohnya adalah operator pengalihan file shell Anda seperti pada command > file.

David Foerster
sumber