वहाँ एक open()
फ़ाइल के लिए एक रास्ता है और इसे हटना करने के लिए कारण? एक, निश्चित रूप से, उन्हें एपेंड-मोड में खोल सकते हैं या अंत में तलाश कर सकते हैं और उन्हें बढ़ने का कारण बना सकते हैं। हालाँकि, जहाँ तक मुझे पता है, किसी फाइल को विशिष्ट यूनिक्स-शैली प्रणाली कॉल इंटरफेस के माध्यम से सिकोड़ने की कोई विधि नहीं है।
ऐसा करने का एकमात्र तरीका, जहाँ तक मुझे पता है, एक नई छोटी फ़ाइल बनाकर और rename()
पुराने के स्थान पर इसे फेक कर है।
मैं सिर्फ पुष्टि चाहता था, क्योंकि मैंने एक जवाब देखा था जिसमें निहित था कि फ़ाइल संपादकों को बनाना संभव था जो एक नया बनाने की प्रक्रिया से गुजरने के बजाय एक फ़ाइल पर सीधे काम करते थे और इसे फिर से नाम देते थे।
मैंने हमेशा सोचा है कि लिबास और यूनिक्स-स्टाइल सिस्टम कॉल इंटरफेस में फाइल एपीआई ने फाइल सिस्टम के कार्यान्वयन में आसानी के लिए फाइलों के सिकुड़ने की अनुमति नहीं दी है और शायद उपयोग के पैटर्न से बचें जो विखंडन में योगदान दे सकते हैं।
open()
और openat()
पहले से ही ट्रंकटिंग के लिए एक ध्वज है, O_TRUNC
इसलिए तकनीकी रूप से यह फ़ाइल को सिकोड़ने का कारण बनता है - अर्थात, पूरी तरह से हटना - इनोड को बदले बिना। इसका सबसे प्रसिद्ध उदाहरण है command > file.txt
, जहां मौजूद होने पर फ़ाइल को छोटा कर दिया जाएगा। आप चलाते हैं strace
पर bash -c 'true > /dev/null'
आप देखेंगे openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)
उत्पादन में। ट्रंकेशन के चर आकार के लिए बेशक आपको truncate()
syscall की आवश्यकता है । अगर आप इसे टिप्पणी के बजाय एक वास्तविक उत्तर के रूप में चाहते हैं तो मुझे बताएं।
fopen
मोड "डब्ल्यू" (या "डब्ल्यू +") के साथ एक फ़ाइल खोलने से यह स्वचालित रूप से शून्य लंबाई तक छोटा हो जाएगा। या क्या आप पुरानी सामग्री को संरक्षित करने के लिए गैर-शून्य आकार में सिकुड़ने का मतलब है?