มีวิธีไปยังopen()
ไฟล์และทำให้ไฟล์ย่อขนาดหรือไม่ แน่นอนหนึ่งสามารถเปิดได้ในโหมดผนวกหรือพยายามที่จะสิ้นสุดและเขียนเพื่อให้พวกเขาเติบโต อย่างไรก็ตามเท่าที่ฉันรู้ไม่มีวิธีการลดขนาดไฟล์ผ่านอินเตอร์เฟซการโทรระบบยูนิกซ์สไตล์ทั่วไป
วิธีเดียวที่จะทำได้เท่าที่ฉันรู้คือการแกล้งทำโดยการสร้างไฟล์ใหม่ที่สั้นกว่าและrename()
แทนที่ไฟล์เก่า
ฉันแค่ต้องการการยืนยันเพราะฉันเห็นคำตอบที่บอกเป็นนัยว่าเป็นไปได้ที่จะทำให้ตัวแก้ไขไฟล์ที่ทำงานบนไฟล์โดยตรงแทนที่จะทำตามขั้นตอนการสร้างใหม่และเปลี่ยนชื่อใหม่
ฉันคิดเสมอว่าไฟล์ api ในอินเตอร์เฟสการเรียกระบบ libc และ unix สไตล์ไม่อนุญาตให้มีการลดขนาดไฟล์เพื่อความสะดวกในการใช้งานระบบไฟล์และอาจหลีกเลี่ยงรูปแบบการใช้งานที่อาจนำไปสู่การกระจายตัว
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 แจ้งให้เราทราบหากคุณต้องการให้นี่เป็นคำตอบที่แท้จริงแทนที่จะเป็นความคิดเห็น
fopen
ในโหมด "w" (หรือ "w +") จะตัดให้มีความยาวเป็นศูนย์โดยอัตโนมัติ หรือคุณหมายถึงการลดขนาดให้ไม่เป็นศูนย์เพื่อรักษาเนื้อหาเก่าไว้บ้าง?