อินเตอร์เฟสการเรียกใช้ระบบทั่วไปอนุญาตให้ลดขนาดไฟล์ (โดยไม่ต้องแทนที่ด้วย inode อื่น) หรือไม่?


9

มีวิธีไปยังopen()ไฟล์และทำให้ไฟล์ย่อขนาดหรือไม่ แน่นอนหนึ่งสามารถเปิดได้ในโหมดผนวกหรือพยายามที่จะสิ้นสุดและเขียนเพื่อให้พวกเขาเติบโต อย่างไรก็ตามเท่าที่ฉันรู้ไม่มีวิธีการลดขนาดไฟล์ผ่านอินเตอร์เฟซการโทรระบบยูนิกซ์สไตล์ทั่วไป

วิธีเดียวที่จะทำได้เท่าที่ฉันรู้คือการแกล้งทำโดยการสร้างไฟล์ใหม่ที่สั้นกว่าและrename()แทนที่ไฟล์เก่า

ฉันแค่ต้องการการยืนยันเพราะฉันเห็นคำตอบที่บอกเป็นนัยว่าเป็นไปได้ที่จะทำให้ตัวแก้ไขไฟล์ที่ทำงานบนไฟล์โดยตรงแทนที่จะทำตามขั้นตอนการสร้างใหม่และเปลี่ยนชื่อใหม่

ฉันคิดเสมอว่าไฟล์ api ในอินเตอร์เฟสการเรียกระบบ libc และ unix สไตล์ไม่อนุญาตให้มีการลดขนาดไฟล์เพื่อความสะดวกในการใช้งานระบบไฟล์และอาจหลีกเลี่ยงรูปแบบการใช้งานที่อาจนำไปสู่การกระจายตัว


2
เพียงแค่เปิดไฟล์ที่มีfopenในโหมด "w" (หรือ "w +") จะตัดให้มีความยาวเป็นศูนย์โดยอัตโนมัติ หรือคุณหมายถึงการลดขนาดให้ไม่เป็นศูนย์เพื่อรักษาเนื้อหาเก่าไว้บ้าง?
Wyzard

4
เพียงแค่ FYI open()และopenat()มีแฟล็กสำหรับตัดทอนอยู่แล้วO_TRUNCดังนั้นในทางเทคนิคแล้วมันจะทำให้ไฟล์หดตัว - นั่นคือหดตัวลงอย่างสมบูรณ์ - โดยไม่เปลี่ยน inode ตัวอย่างที่มีชื่อเสียงที่สุดคือcommand > file.txtไฟล์จะถูกตัดหากมีอยู่ หากคุณทำงานstraceบนbash -c 'true > /dev/null'คุณจะเห็นopenat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)ในการส่งออก แน่นอนว่าสำหรับขนาดของการตัดทอนคุณต้องใช้truncate()syscall แจ้งให้เราทราบหากคุณต้องการให้นี่เป็นคำตอบที่แท้จริงแทนที่จะเป็นความคิดเห็น
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy ฉันกำลังคิดที่จะลดขนาดลงโดยพลการ ฉันยกระดับคำตอบของ David Foerster เพราะมันตอบคำถามย่อย แต่ฉันไม่ยอมรับในแง่ของอิคารัส ฉันคิดว่ามันเป็นคำตอบที่ใช่และไม่ใช่ในขณะที่คำตอบของอิคารัสแสดงให้เห็นแล้วว่าคำตอบที่แท้จริงคือ "ใช่"
JoL

คำตอบ:


22

man -s 2 ftruncate กล่าวว่า

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).

มันก็จะบอกว่าถ้าคุณใช้ ftruncate คุณต้องเปิดไฟล์สำหรับการเขียนและถ้าคุณใช้การตัดทอนไฟล์จะต้องเขียนได้


ผนวกกับไฟล์ที่เป็นสาเหตุที่ทำให้ระบบปฏิบัติการครั้งแรกtruncateมันจะรองรับขนาดไฟล์ใหม่และแล้ว writeมัน ดังนั้นtruncateระบบจะโทรหาคุณ
mgarciaisaia

1
บน Linux ดูได้ที่fallocate(FALLOC_FL_COLLAPSE_RANGE)
Stéphane Chazelas

2

การopen(2)เรียกระบบยอมรับการO_TRUNCตั้งค่าสถานะที่สามารถลดขนาดไฟล์:

O_TRUNC- หากไฟล์มีอยู่และเป็นไฟล์ปกติและไฟล์นั้นถูกเปิดเรียบร้อยO_RDWRหรือO_WRONLYความยาวของไฟล์นั้นจะถูกตัดเหลือ 0 และโหมดและเจ้าของจะไม่เปลี่ยนแปลง มันจะไม่มีผลกับไฟล์พิเศษ FIFO หรือไฟล์อุปกรณ์ปลายทาง มันมีผลต่อไฟล์ประเภทอื่นคือการใช้งานที่กำหนดไว้ ผลลัพธ์ของการใช้O_TRUNCโดยไม่มีO_RDWRหรือO_WRONLYไม่ได้กำหนด

มันถูกใช้บ่อยเมื่อโปรแกรมมีวัตถุประสงค์เพื่อเขียนทับเนื้อหาของไฟล์ทั้งหมด command > fileตัวอย่างคือผู้ประกอบการเปลี่ยนเส้นทางไฟล์เปลือกของคุณในขณะที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.